From b4d5fcf24414a514f7cea00514d9b5c07b2d4736 Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Wed, 23 Apr 2025 20:23:41 +0200 Subject: [PATCH] Update On Wed Apr 23 20:23:40 CEST 2025 --- Cargo.lock | 61 +- Cargo.toml | 23 +- accessible/interfaces/msaa/moz.build | 2 +- accessible/mac/AccessibleWrap.mm | 3 + accessible/mac/mozAccessible.mm | 21 +- accessible/mac/mozHTMLAccessible.h | 7 + accessible/mac/mozHTMLAccessible.mm | 8 + accessible/tests/browser/mac/browser.toml | 1 + .../tests/browser/mac/browser_label_title.js | 4 +- aclocal.m4 | 14 + browser/actors/AboutReaderParent.sys.mjs | 22 +- browser/app/profile/firefox.js | 3 - browser/base/content/metrics.yaml | 88 - browser/base/content/sanitizeDialog.js | 56 +- .../test/favicons/browser_favicon_nostore.js | 48 +- .../test/favicons/browser_favicon_store.js | 24 +- .../content/test/performance/browser.toml | 3 + .../sanitize/browser_sanitizeDialog_v2.js | 128 - browser/base/content/test/webrtc/browser.toml | 3 + .../test/webrtc/gracePeriod/browser.toml | 1 + browser/base/content/webext-panels.xhtml | 2 +- browser/components/BrowserGlue.sys.mjs | 2 +- .../content-src/aboutwelcome.scss | 4 + .../aboutwelcome/content/aboutwelcome.css | 5 + .../aboutwelcome/tests/unit/unit-entry.js | 1 - .../asrouter/modules/InfoBar.sys.mjs | 57 +- .../asrouter/tests/browser/browser.toml | 3 + .../browser_asrouter_experimentsAPILoader.js | 12 +- .../tests/browser/browser_asrouter_infobar.js | 116 + .../browser/browser_trigger_messagesLoaded.js | 2 +- .../asrouter/tests/unit/ASRouter.test.js | 11 - .../asrouter/tests/unit/unit-entry.js | 1 - browser/components/attribution/metrics.yaml | 102 + .../test/browser/browser.toml | 1 + .../customizableui/test/browser.toml | 9 + .../enterprisepolicies/Policies.sys.mjs | 27 +- .../schemas/policies-schema.json | 7 +- .../tests/browser/browser_policy_bookmarks.js | 23 +- .../browser/browser_policy_usermessaging.js | 4 +- .../xpcshell/test_simple_pref_policies.js | 41 +- .../extensions/test/browser/browser.toml | 4 + browser/components/genai/LinkPreview.sys.mjs | 6 +- .../components/genai/LinkPreviewChild.sys.mjs | 4 +- .../genai/content/link-preview-card.css | 32 +- .../genai/content/link-preview-card.mjs | 42 +- .../migration/tests/unit/head_migration.js | 33 +- browser/components/moz.build | 1 - .../places/tests/browser/browser.toml | 1 + .../unit/test_browserGlue_distribution.js | 34 +- browser/components/pocket/test/browser.toml | 1 + browser/components/preferences/privacy.js | 2 +- .../tests/browser_privacy_dnsoverhttps.js | 94 +- .../profiles/tests/browser/browser.toml | 11 +- .../search/BrowserSearchTelemetry.sys.mjs | 22 +- .../components/search/content/searchbar.js | 30 +- browser/components/search/metrics.yaml | 28 + .../test/browser/telemetry/browser.toml | 2 + .../browser_search_telemetry_searchform.js | 164 + .../browser_search_telemetry_sources.js | 106 +- .../components/sessionstore/test/browser.toml | 2 +- .../sessionstore/test/browser_oldformat.toml | 1 + .../shell/nsGNOMEShellSearchProvider.cpp | 71 +- browser/components/sidebar/browser-sidebar.js | 11 +- .../tests/browser/browser_glean_sidebar.js | 3 +- browser/components/topsites/TopSites.sys.mjs | 18 +- .../test/unit/test_FaviconProvider.js | 53 +- .../components/urlbar/MerinoClient.sys.mjs | 14 +- browser/components/urlbar/UrlbarInput.sys.mjs | 78 +- .../urlbar/UrlbarProviderInputHistory.sys.mjs | 21 +- .../urlbar/UrlbarProviderPlaces.sys.mjs | 22 +- .../quicksuggest/unit/test_merinoClient.js | 14 + browser/config/mozconfigs/linux32/devedition | 2 +- .../mozconfigs/linux32/nightly-fuzzing-asan | 2 +- .../config/mozconfigs/linux64/add-on-devel | 2 +- .../mozconfigs/linux64/debug-searchfox-clang | 4 +- .../linux64/debug-static-analysis-clang | 2 +- browser/config/mozconfigs/linux64/devedition | 2 +- .../mozconfigs/linux64/nightly-fuzzing-asan | 2 +- .../linux64/nightly-fuzzing-asan-noopt | 2 +- .../linux64/nightly-fuzzing-asan-nyx | 2 +- browser/config/mozconfigs/linux64/non-unified | 2 +- browser/config/mozconfigs/linux64/valgrind | 2 +- .../mozconfigs/macosx64-aarch64/add-on-devel | 2 +- .../macosx64-aarch64/cross-noopt-debug | 2 +- .../mozconfigs/macosx64-aarch64/devedition | 2 +- .../config/mozconfigs/macosx64/add-on-devel | 2 +- .../mozconfigs/macosx64/cross-noopt-debug | 2 +- .../mozconfigs/macosx64/debug-searchfox | 4 +- .../mozconfigs/macosx64/debug-static-analysis | 2 +- browser/config/mozconfigs/macosx64/devedition | 2 +- .../config/mozconfigs/macosx64/non-unified | 2 +- .../mozconfigs/macosx64/opt-static-analysis | 2 +- browser/config/mozconfigs/win32/add-on-devel | 2 +- .../mozconfigs/win32/debug-static-analysis | 2 +- browser/config/mozconfigs/win32/devedition | 2 +- browser/config/mozconfigs/win32/mingwclang | 18 +- browser/config/mozconfigs/win32/noopt-debug | 2 +- .../mozconfigs/win64-aarch64/devedition | 2 +- browser/config/mozconfigs/win64/add-on-devel | 2 +- .../config/mozconfigs/win64/debug-searchfox | 4 +- browser/config/mozconfigs/win64/devedition | 2 +- browser/config/mozconfigs/win64/mingwclang | 18 +- browser/config/mozconfigs/win64/non-unified | 2 +- browser/config/mozconfigs/win64/noopt-debug | 2 +- .../browser_dynamic_form_autocompletion.js | 171 + .../test/browser/creditCard/browser.toml | 4 + .../formautofill/test/unit/xpcshell.toml | 7 + browser/extensions/newtab/common/Actions.mjs | 2 +- .../extensions/newtab/common/Reducers.sys.mjs | 8 +- .../content-src/components/Base/Base.jsx | 7 +- .../SectionsMgmtPanel/SectionsMgmtPanel.jsx | 36 +- .../CardSections/CardSections.jsx | 26 +- .../InterestPicker/InterestPicker.jsx | 14 +- .../SectionContextMenu/SectionContextMenu.jsx | 4 +- .../content-src/lib/link-menu-options.mjs | 21 +- .../data/content/activity-stream.bundle.js | 104 +- .../newtab/lib/DiscoveryStreamFeed.sys.mjs | 60 +- .../extensions/newtab/lib/PlacesFeed.sys.mjs | 7 +- .../CardSections.test.jsx | 8 +- .../extensions/newtab/test/unit/unit-entry.js | 1 - .../newtab/test/xpcshell/test_PlacesFeed.js | 3 +- .../data/picture_in_picture_overrides.js | 12 + .../pictureinpicture/video-wrappers/zdf.js | 42 + browser/extensions/webcompat/data/shims.js | 16 + browser/extensions/webcompat/manifest.json | 2 +- .../en-US/browser/contextual-manager.ftl | 7 + browser/locales/l10n-changesets.json | 226 +- build/autoconf/acgeneral.m4 | 2607 + build/autoconf/acoldnames.m4 | 80 + build/autoconf/acspecific.m4 | 2758 + build/autoconf/altoptions.m4 | 72 + build/autoconf/autoconf.m4 | 28 + build/autoconf/autoconf.sh | 158 + build/autoconf/config.status.m4 | 162 + build/autoconf/hooks.m4 | 31 + build/gecko_templates.mozbuild | 2 + build/moz.configure/flags.configure | 1 + build/moz.configure/init.configure | 50 +- build/moz.configure/lto-pgo.configure | 6 +- build/moz.configure/old.configure | 395 + build/moz.configure/rust.configure | 7 + build/moz.configure/toolchain.configure | 8 + build/mozconfig.artifact.automation | 2 +- build/rust/itertools/Cargo.toml | 17 + build/rust/itertools/lib.rs | 5 + build/workspace-hack/Cargo.toml | 2 +- config/external/gkcodecs/moz.build | 2 +- config/external/icu/data/icudt77l.dat | Bin 15029632 -> 15030688 bytes config/external/lgpllibs/moz.build | 2 +- config/makefiles/rust.mk | 1 + configure.py | 44 +- .../browser_aboutdebugging_tab_favicons.js | 9 +- .../debugger/src/actions/sources-tree.js | 20 +- devtools/client/debugger/src/main.js | 1 + .../debugger/src/reducers/sources-tree.js | 109 +- .../debugger/src/selectors/sources-tree.js | 13 +- .../client/debugger/src/test/tests-setup.js | 3 - .../client/debugger/src/utils/bootstrap.js | 5 + devtools/client/debugger/src/utils/prefs.js | 11 - .../mochitest/browser_dbg-project-root.js | 109 +- .../inspector/rules/models/element-style.js | 2 +- .../inspector/rules/test/browser_part2.toml | 1 - .../browser_rules_editable-field-focus_02.js | 2 +- .../test/browser_rules_mathml-element.js | 54 +- .../src/components/previews/HtmlPreview.js | 20 +- .../request-details/ResponsePanel.js | 6 +- .../test/browser_net_copy_as_curl.js | 4 +- .../netmonitor/test/browser_net_curl-utils.js | 40 +- .../test/browser_net_html-preview.js | 145 +- .../client/performance-new/@types/gecko.d.ts | 18 +- .../performance-new/shared/background.sys.mjs | 9 +- devtools/client/shared/curl.js | 70 +- .../client/shared/test/xpcshell/test_curl.js | 17 +- devtools/client/shared/thread-utils.js | 1 + devtools/server/actors/descriptors/tab.js | 6 +- devtools/server/actors/page-style.js | 3 +- devtools/server/actors/utils/style-utils.js | 21 +- .../browser_style_utils_getFontPreviewData.js | 18 + .../compatibility/dataset/css-properties.json | 2 +- docs/config.yml | 1 + docshell/base/BrowsingContext.h | 3 - docshell/base/CanonicalBrowsingContext.cpp | 1 - docshell/shistory/nsISHistory.idl | 2 - docshell/shistory/nsSHistory.cpp | 39 - docshell/shistory/nsSHistory.h | 11 - docshell/test/browser/browser.toml | 5 +- dom/animation/Animation.cpp | 16 +- dom/animation/CSSAnimation.cpp | 2 +- dom/base/ChromeUtils.cpp | 7 + dom/base/ChromeUtils.h | 4 + dom/base/Document.cpp | 7 +- dom/base/DocumentOrShadowRoot.cpp | 3 +- dom/base/Element.cpp | 3 +- dom/base/FlushType.h | 10 +- dom/base/Nyx.cpp | 34 +- dom/base/UseCounters.conf | 4 + dom/base/nsContentUtils.cpp | 27 - dom/base/nsContentUtils.h | 5 - dom/base/nsDOMWindowUtils.cpp | 13 +- dom/base/nsGlobalWindowOuter.cpp | 22 +- dom/base/nsGlobalWindowOuter.h | 2 - dom/base/test/browser.toml | 2 + dom/base/use_counter_metrics.yaml | 74 +- dom/canvas/CanvasRenderingContext2D.cpp | 23 +- dom/chrome-webidl/ChromeUtils.webidl | 3 + dom/events/EventStateManager.cpp | 30 +- dom/events/EventStateManager.h | 7 +- dom/media/gtest/TestMediaDataEncoder.cpp | 26 +- dom/media/ipc/MFCDMParent.cpp | 76 +- .../mediacontrol/tests/browser/browser.toml | 4 + dom/media/platforms/apple/AppleUtils.cpp | 80 + dom/media/platforms/apple/AppleUtils.h | 139 +- dom/media/platforms/apple/AppleVTDecoder.cpp | 51 +- dom/media/platforms/apple/AppleVTDecoder.h | 5 +- dom/media/platforms/apple/AppleVTEncoder.cpp | 154 +- dom/media/platforms/apple/AppleVTEncoder.h | 11 +- dom/media/platforms/moz.build | 2 + dom/media/platforms/wmf/WMFEncoderModule.cpp | 3 + .../platforms/wmf/WMFMediaDataEncoder.cpp | 3 +- dom/media/test/mochitest.toml | 3 + dom/media/test/mochitest_compat.toml | 1 + .../test/reftest/color_quads/reftest.list | 20 +- dom/media/test/reftest/reftest.list | 2 +- dom/media/tests/crashtests/crashtests.list | 4 +- .../webrtc/tests/crashtests/crashtests.list | 2 +- .../mochitests/mochitest_datachannel.toml | 3 + .../mochitests/mochitest_peerconnection.toml | 5 +- .../xpcshell/test_temporaryStorageEviction.js | 327 + dom/quota/test/xpcshell/xpcshell.toml | 2 + dom/security/nsCSPUtils.cpp | 22 + dom/security/nsCSPUtils.h | 5 + dom/security/nsContentSecurityUtils.cpp | 1 + dom/security/test/https-first/browser.toml | 1 + .../test/test_serviceworker_interfaces.js | 82 +- dom/svg/DOMSVGLength.cpp | 22 +- dom/svg/DOMSVGLength.h | 9 +- dom/svg/DOMSVGPoint.cpp | 17 +- dom/svg/DOMSVGPoint.h | 19 +- dom/svg/DOMSVGPointList.cpp | 9 +- dom/svg/DOMSVGPointList.h | 6 + dom/svg/DOMSVGStringList.cpp | 5 +- dom/svg/DOMSVGStringList.h | 6 + .../mochitest/general/test_interfaces.js | 82 +- dom/view-transitions/ViewTransition.cpp | 12 +- dom/webgpu/moz.build | 8 +- dom/webgpu/tests/cts/vendor/Cargo.lock | 7 + dom/webgpu/tests/cts/vendor/Cargo.toml | 1 + dom/webgpu/tests/cts/vendor/src/main.rs | 97 +- dom/webgpu/tests/cts/vendor/src/test_split.rs | 202 + .../mochitest/mochitest-no-pref.toml | 0 .../mochitest-resistfingerprinting.toml | 0 .../{ => tests}/mochitest/mochitest.toml | 0 .../{ => tests}/mochitest/perftest.toml | 0 .../mochitest/test_basic_canvas.worker.html | 0 .../mochitest/test_basic_canvas.worker.js | 0 .../mochitest/test_buffer_mapping.html | 0 .../test_buffer_mapping_invalid_device.html | 0 ...test_buffer_mapping_overlapping_views.html | 0 .../test_command_buffer_creation.html | 0 .../test_compilation_message_pos.html | 0 .../mochitest/test_context_configure.html | 0 .../test_core_features_and_limits.html | 0 .../mochitest/test_device_creation.html | 0 .../mochitest/test_device_lost.html | 0 .../{ => tests}/mochitest/test_disabled.html | 0 .../mochitest/test_double_encoder_finish.html | 0 .../{ => tests}/mochitest/test_enabled.html | 0 .../test_encoder_cycle_collection.html | 0 .../mochitest/test_error_scope.html | 0 .../mochitest/test_insecure_context.html | 0 .../test_navigator_gpu_not_replaceable.html | 0 ...test_queue_copyExternalImageToTexture.html | 0 .../mochitest/test_queue_write.html | 0 .../test_queue_write_invalid_device.html | 0 .../mochitest/test_queue_write_perf.html | 0 .../mochitest/test_rfp_clamp_limits_off.html | 0 .../mochitest/test_rfp_clamp_limits_on.html | 0 .../mochitest/test_set_bind_group_null.html | 0 .../mochitest/test_shared_array_buffer.html | 0 .../mochitest/test_submit_compute_empty.html | 0 .../mochitest/test_submit_render_empty.html | 0 .../test_submit_render_empty.worker.html | 0 .../test_submit_render_empty.worker.js | 0 .../{ => tests}/mochitest/worker_wrapper.js | 0 dom/webidl/Animation.webidl | 2 +- dom/workers/test/test_worker_interfaces.js | 82 +- editor/libeditor/HTMLEditSubActionHandler.cpp | 25 +- gfx/angle/targets/libEGL/moz.build | 2 +- gfx/angle/targets/libGLESv2/moz.build | 2 +- gfx/angle/update-angle.py | 2 +- gfx/layers/AnimationInfo.cpp | 3 +- .../apz/public/CompositorScrollUpdate.h | 14 +- gfx/layers/apz/src/APZCTreeManager.cpp | 2 - gfx/layers/apz/src/AsyncPanZoomController.cpp | 114 +- gfx/layers/apz/src/AsyncPanZoomController.h | 12 +- gfx/layers/apz/src/SampledAPZCState.cpp | 15 +- gfx/layers/apz/src/SampledAPZCState.h | 7 +- gfx/layers/ipc/LayersMessageUtils.h | 21 +- .../ipc/UiCompositorControllerChild.cpp | 2 - .../ipc/UiCompositorControllerParent.cpp | 2 - gfx/thebes/gfxPlatform.cpp | 6 +- gfx/wr/Cargo.lock | 8 +- gfx/wr/Cargo.toml | 2 +- gradle/libs.versions.toml | 8 +- .../reftest/color-management/reftest.list | 2 +- image/test/reftest/downscaling/reftest.list | 4 +- intl/tzdata/GIT-INFO | 8 +- intl/tzdata/VERSION | 2 +- intl/tzdata/source/be/metaZones.res | Bin 42848 -> 42928 bytes intl/tzdata/source/be/timezoneTypes.res | Bin 21168 -> 21248 bytes intl/tzdata/source/be/windowsZones.res | Bin 21984 -> 22064 bytes intl/tzdata/source/be/zoneinfo64.res | Bin 147792 -> 148608 bytes intl/tzdata/source/ee/metaZones.res | Bin 42848 -> 42928 bytes intl/tzdata/source/ee/timezoneTypes.res | Bin 21168 -> 21248 bytes intl/tzdata/source/ee/windowsZones.res | Bin 21984 -> 22064 bytes intl/tzdata/source/ee/zoneinfo64.res | Bin 147792 -> 148608 bytes intl/tzdata/source/le/metaZones.res | Bin 42848 -> 42928 bytes intl/tzdata/source/le/timezoneTypes.res | Bin 21168 -> 21248 bytes intl/tzdata/source/le/windowsZones.res | Bin 21984 -> 22064 bytes intl/tzdata/source/le/zoneinfo64.res | Bin 147792 -> 148608 bytes intl/tzdata/source/metaZones.txt | 7 + intl/tzdata/source/timezoneTypes.txt | 5 +- intl/tzdata/source/windowsZones.txt | 2 +- intl/tzdata/source/zoneinfo64.txt | 2695 +- js/moz.configure | 24 + js/public/HeapAPI.h | 5 +- js/public/friend/ErrorNumbers.msg | 3 + js/src/aclocal.m4 | 23 + js/src/build/moz.build | 2 +- js/src/builtin/intl/TimeZoneDataGenerated.h | 3 +- js/src/configure | 1 + js/src/devtools/rootAnalysis/mozconfig.common | 6 +- js/src/gc/Allocator.h | 10 +- js/src/gc/BufferAllocator-inl.h | 31 +- js/src/gc/BufferAllocator.cpp | 833 +- js/src/gc/BufferAllocator.h | 109 +- js/src/gc/Cell.h | 2 + js/src/gc/Compacting.cpp | 11 +- js/src/gc/GC.cpp | 13 +- js/src/gc/GCRuntime.h | 13 +- js/src/gc/Heap.cpp | 25 +- js/src/gc/Heap.h | 2 +- js/src/gc/Marking.cpp | 4 +- js/src/gc/Nursery.cpp | 24 +- js/src/gc/Nursery.h | 10 - js/src/gc/Sweeping.cpp | 9 +- js/src/gc/Tracer.h | 4 +- js/src/gc/Zone.cpp | 11 + js/src/gc/Zone.h | 4 +- .../wasm/wasm-resizablearraybuffer-cloning.js | 12 + .../wasm/wasm-resizablearraybuffer-shared.js | 127 + .../tests/wasm/wasm-resizablearraybuffer.js | 135 + js/src/jit/ABIFunctionList-inl.h | 233 +- js/src/jit/VMFunctionList-inl.h | 28 +- js/src/jit/VMFunctions.cpp | 4 +- js/src/jsapi-tests/testGCAllocator.cpp | 34 +- js/src/jsapi-tests/testJitABIcalls.cpp | 4 +- js/src/make-source-package.py | 29 + js/src/old-configure.in | 23 + .../Intl/DateTimeFormat/timeZone_links.js | 2 +- .../Intl/DateTimeFormat/timeZone_version.js | 4 +- .../supportedValuesOf-timeZones-canonical.js | 3 +- .../Temporal/ZonedDateTime/zones-and-links.js | 3 +- js/src/vm/ArrayBufferObject.cpp | 90 +- js/src/vm/ArrayBufferObject.h | 12 + js/src/vm/JSObject.cpp | 24 +- js/src/vm/NativeObject.cpp | 5 +- js/src/vm/NativeObject.h | 3 +- js/src/vm/SharedArrayObject.cpp | 83 +- js/src/vm/SharedArrayObject.h | 36 +- js/src/vm/StructuredClone.cpp | 2 +- js/src/wasm/WasmJS.cpp | 143 +- js/src/wasm/WasmJS.h | 11 + js/sub.configure | 89 + layout/base/PresShell.cpp | 27 +- layout/base/RestyleManager.cpp | 4 - layout/base/nsLayoutUtils.cpp | 12 - layout/base/nsLayoutUtils.h | 6 - layout/base/nsPresContext.cpp | 3 +- layout/base/nsRefreshDriver.cpp | 10 - layout/base/nsRefreshDriver.h | 2 +- layout/generic/ReflowInput.h | 22 +- layout/generic/nsIFrame.cpp | 6 - layout/generic/nsTextFrame.cpp | 153 +- layout/reftests/box-shadow/reftest.list | 2 +- .../reftests/first-letter/399941-2-ref.html | 7 +- layout/reftests/first-letter/399941-2.html | 5 +- layout/reftests/image-element/reftest.list | 4 +- layout/reftests/svg/reftest.list | 2 +- media/gmp-clearkey/0.1/moz.build | 2 +- media/wmf-clearkey/moz.build | 2 +- memory/app.mozbuild | 1 + mfbt/ChaosMode.h | 9 + mfbt/moz.build | 3 +- .../src/main/res/values-tl/strings.xml | 6 + .../menu/src/main/res/values-tl/strings.xml | 2 + .../components/compose/base/build.gradle | 2 + .../base/progressbar/AnimatedProgressBar.kt | 277 + .../base/src/main/res/values-bg/strings.xml | 13 + .../base/src/main/res/values-cy/strings.xml | 2 + .../base/src/main/res/values-de/strings.xml | 2 + .../base/src/main/res/values-dsb/strings.xml | 2 + .../base/src/main/res/values-eo/strings.xml | 11 + .../src/main/res/values-es-rAR/strings.xml | 2 + .../base/src/main/res/values-gl/strings.xml | 13 + .../base/src/main/res/values-hsb/strings.xml | 2 + .../base/src/main/res/values-iw/strings.xml | 2 + .../src/main/res/values-nn-rNO/strings.xml | 2 + .../base/src/main/res/values-pl/strings.xml | 11 + .../src/main/res/values-pt-rPT/strings.xml | 2 + .../src/main/res/values-sv-rSE/strings.xml | 2 + .../base/src/main/res/values-tr/strings.xml | 2 + .../base/src/main/res/values/strings.xml | 2 + .../browser/toolbar/BrowserDisplayToolbar.kt | 102 +- .../compose/browser/toolbar/BrowserToolbar.kt | 3 + .../toolbar/store/BrowserToolbarAction.kt | 7 + .../store/BrowserToolbarInteraction.kt | 63 +- .../toolbar/store/BrowserToolbarState.kt | 39 +- .../toolbar/store/BrowserToolbarStore.kt | 6 + .../browser/toolbar/ui/ActionButton.kt | 10 +- .../toolbar/ui/PopupToMenuItemsMapper.kt | 69 +- .../compose/browser/toolbar/ui/TabCounter.kt | 9 +- .../cfr/src/main/res/values-tl/strings.xml | 5 + .../addons/src/main/res/values-tl/strings.xml | 44 + .../feature/app/links/AppLinksInterceptor.kt | 31 +- .../feature/app/links/AppLinksUseCases.kt | 38 +- .../src/main/res/values-eo/strings.xml | 10 + .../app/links/AppLinksInterceptorTest.kt | 49 +- .../feature/app/links/AppLinksUseCasesTest.kt | 24 + .../src/main/res/values-tl/strings.xml | 2 + .../src/main/res/values-tl/strings.xml | 4 + .../src/main/res/values-eo/strings.xml | 29 + .../src/main/res/values-pl/strings.xml | 29 + .../src/main/res/values-tl/strings.xml | 17 + .../src/main/res/values-ml/strings.xml | 8 +- .../src/main/res/values-tl/strings.xml | 58 + .../search/middleware/SearchMiddleware.kt | 22 +- .../components/support/utils/build.gradle | 2 + .../components/support/utils/ColorUtils.kt | 21 + .../support/utils/ColorUtilsTest.kt | 36 + .../src/main/java/ApplicationServices.kt | 2 +- .../dependencies/src/main/java/moz.yaml | 4 +- .../browser/BrowserToolbarMiddleware.kt | 4 +- .../samples/toolbar/compose/BrowserToolbar.kt | 3 + .../middleware/BrowserToolbarMiddleware.kt | 60 +- .../android-arm-gradle-dependencies/base | 2 +- .../android-arm/nightly-android-lints | 2 +- .../android-arm/nightly-android-lints-lite | 2 +- .../android/config/mozconfigs/common.override | 2 +- mobile/android/fenix/app/build.gradle | 39 +- .../fenix/app/src/main/AndroidManifest.xml | 49 +- .../mozilla/fenix/AppRequestInterceptor.kt | 13 +- .../src/main/java/org/mozilla/fenix/Config.kt | 7 - .../org/mozilla/fenix/FenixApplication.kt | 16 - .../fenix/MozillaOnlineHomeActivity.kt | 29 - .../fenix/addons/AddonsManagementFragment.kt | 11 - .../fenix/browser/BaseBrowserFragment.kt | 60 +- .../browser/store/BrowserScreenAction.kt | 29 + .../browser/store/BrowserScreenMiddleware.kt | 133 + .../fenix/browser/store/BrowserScreenState.kt | 16 + .../fenix/browser/store/BrowserScreenStore.kt | 35 + .../org/mozilla/fenix/components/Analytics.kt | 5 +- .../java/org/mozilla/fenix/components/Core.kt | 69 +- .../org/mozilla/fenix/components/FxaServer.kt | 14 +- .../org/mozilla/fenix/components/Services.kt | 2 + .../mozilla/fenix/components/StoreProvider.kt | 35 +- .../fenix/components/appstate/AppAction.kt | 9 + .../components/appstate/AppStoreReducer.kt | 4 + .../setup/checklist/SetupChecklistReducer.kt | 7 +- .../setup/checklist/SetupChecklistState.kt | 4 + .../appstate/snackbar/SnackbarState.kt | 9 + .../fenix/components/menu/compose/MenuItem.kt | 4 + .../toolbar/BrowserToolbarComposable.kt | 66 +- .../toolbar/BrowserToolbarMiddleware.kt | 347 +- .../mozilla/fenix/compose/list/ListItem.kt | 9 +- .../distributions/DistributionIdManager.kt | 4 - .../org/mozilla/fenix/gecko/GeckoProvider.kt | 31 - .../org/mozilla/fenix/home/HomeFragment.kt | 14 +- .../java/org/mozilla/fenix/home/HomeMenu.kt | 10 - .../org/mozilla/fenix/home/HomeMenuView.kt | 7 +- .../controller/RecentSyncedTabController.kt | 18 +- .../SessionControlController.kt | 2 - .../SetupChecklistPreferencesMiddleware.kt | 38 +- .../setup/store/SetupChecklistRepository.kt | 28 +- .../home/setup/ui/SetupChecklistViewHolder.kt | 2 +- .../mozilla/fenix/home/store/HomepageState.kt | 4 +- .../home/toolbar/BrowserToolbarMiddleware.kt | 235 +- .../home/toolbar/HomeToolbarComposable.kt | 37 +- .../home/topsites/TopSiteItemViewHolder.kt | 15 - .../mozilla/fenix/home/topsites/TopSites.kt | 5 - .../org/mozilla/fenix/home/ui/Homepage.kt | 2 +- .../org/mozilla/fenix/home/ui/SearchBar.kt | 2 + .../library/bookmarks/BookmarkFragment.kt | 1 + .../mozilla/fenix/perf/StrictModeManager.kt | 10 - .../fenix/settings/DataChoicesFragment.kt | 7 +- .../mozilla/fenix/settings/PairFragment.kt | 9 +- .../mozilla/fenix/settings/PhoneFeature.kt | 35 + .../fenix/settings/SettingsFragment.kt | 50 +- .../mozilla/fenix/settings/SupportUtils.kt | 9 - .../fenix/settings/account/AccountUiView.kt | 3 - .../settings/account/TurnOnSyncFragment.kt | 7 +- .../settings/search/SearchEngineFragment.kt | 1 + .../sitepermissions/SiteSettingsFragment.kt | 4 - .../settings/trustpanel/TrustPanelFragment.kt | 374 +- .../middleware/TrustPanelMiddleware.kt | 95 +- .../TrustPanelNavigationMiddleware.kt | 30 +- .../TrustPanelTelemetryMiddleware.kt | 10 +- .../trustpanel/store/TrustPanelAction.kt | 92 +- .../trustpanel/store/TrustPanelState.kt | 97 + .../trustpanel/store/TrustPanelStore.kt | 135 +- .../trustpanel/ui/ConnectionSecurityPanel.kt | 26 +- .../settings/trustpanel/ui/ProtectionPanel.kt | 188 +- .../trustpanel/ui/ProtectionPanelHeader.kt | 33 +- .../mozilla/fenix/snackbar/SnackbarBinding.kt | 15 + .../java/org/mozilla/fenix/utils/Settings.kt | 11 +- .../di/WebCompatReporterMiddlewareProvider.kt | 1 + .../WebCompatReporterSubmissionMiddleware.kt | 47 + .../webcompat/store/WebCompatReporterStore.kt | 8 +- .../webcompat/ui/WebCompatReporterFragment.kt | 2 +- .../app/src/main/res/drawable/ic_baidu.webp | Bin 1490 -> 0 bytes .../app/src/main/res/drawable/ic_jd.webp | Bin 2626 -> 0 bytes .../app/src/main/res/drawable/ic_meituan.webp | Bin 4262 -> 0 bytes .../app/src/main/res/drawable/ic_pdd.webp | Bin 8172 -> 0 bytes .../app/src/main/res/drawable/ic_tc.webp | Bin 2040 -> 0 bytes .../app/src/main/res/navigation/nav_graph.xml | 5 + .../src/main/res/raw/initial_experiments.json | 102 - .../app/src/main/res/values-cs/strings.xml | 62 + .../app/src/main/res/values-da/strings.xml | 4 + .../app/src/main/res/values-eo/strings.xml | 355 +- .../src/main/res/values-es-rES/strings.xml | 26 + .../app/src/main/res/values-es/strings.xml | 26 + .../app/src/main/res/values-fr/strings.xml | 4 + .../app/src/main/res/values-lo/strings.xml | 58 + .../app/src/main/res/values-pl/strings.xml | 182 + .../src/main/res/values-pt-rPT/strings.xml | 10 +- .../app/src/main/res/values-si/strings.xml | 3 + .../app/src/main/res/values-tg/strings.xml | 40 + .../app/src/main/res/values-tl/strings.xml | 982 +- .../app/src/main/res/values-tr/strings.xml | 2 +- .../app/src/main/res/values-uk/strings.xml | 26 + .../res/values-zh-rCN/mozonline_strings.xml | 24 - .../src/main/res/values-zh-rCN/strings.xml | 8 +- .../src/main/res/values-zh-rTW/strings.xml | 8 +- .../src/main/res/values/mozonline_strings.xml | 24 - .../src/main/res/values/preference_keys.xml | 2 +- .../fenix/app/src/main/res/values/strings.xml | 4 +- .../app/src/main/res/xml/preferences.xml | 5 - .../fenix/AppRequestInterceptorTest.kt | 19 +- .../store/BrowserScreenMiddlewareTest.kt | 118 + .../browser/store/BrowserScreenStoreTest.kt | 47 + .../mozilla/fenix/components/AppStoreTest.kt | 4 +- .../fenix/components/StoreProviderTest.kt | 33 + .../appstate/AppStoreReducerTest.kt | 14 + .../checklist/SetupChecklistReducerTest.kt | 6 +- .../toolbar/BrowserToolbarMiddlewareTest.kt | 822 +- .../DistributionIdManagerTest.kt | 33 - .../fenix/ext/ConnectivityManagerTest.kt | 3 - .../fenix/home/PocketUpdatesMiddlewareTest.kt | 164 +- .../DefaultRecentSyncedTabControllerTest.kt | 32 + .../DefaultSetupChecklistRepositoryTest.kt | 89 +- ...SetupChecklistPreferencesMiddlewareTest.kt | 20 +- .../toolbar/BrowserToolbarMiddlewareTest.kt | 494 +- .../trustpanel/TrustPanelMiddlewareTest.kt | 228 +- .../TrustPanelNavigationMiddlewareTest.kt | 69 +- .../trustpanel/TrustPanelStoreTest.kt | 199 + .../fenix/snackbar/SnackbarBindingTest.kt | 36 +- ...bCompatReporterSubmissionMiddlewareTest.kt | 49 +- .../store/WebCompatReporterStoreTest.kt | 8 + .../app/src/main/res/values-eo/strings.xml | 24 + .../app/src/main/res/values-pl/strings.xml | 2 +- .../test/ContentDelegateChildTest.kt | 920 +- .../geckoview/test/PanZoomControllerTest.kt | 11 +- .../mozilla/geckoview/test/PdfCreationTest.kt | 2 - .../geckoview/test/PermissionDelegateTest.kt | 910 +- .../ios/config/mozconfigs/ios/debug-searchfox | 4 +- mobile/locales/l10n-changesets.json | 196 +- .../geckoview/GeckoViewStartup.sys.mjs | 3 + modules/libpref/init/StaticPrefList.yaml | 16 - moz.build | 3 + moz.configure | 10 + netwerk/protocol/http/Http3Session.cpp | 4 +- netwerk/socket/neqo_glue/NeqoHttp3Conn.h | 16 +- netwerk/socket/neqo_glue/src/lib.rs | 153 +- netwerk/test/browser/browser.toml | 1 + netwerk/test/unit/xpcshell.toml | 2 + netwerk/test/unit_ipc/xpcshell.toml | 2 + old-configure.in | 18 + python/mach/mach/telemetry.py | 3 + python/mozboot/mozboot/android.py | 2 +- python/mozboot/mozboot/mach_commands.py | 4 +- python/mozboot/mozboot/mozconfig.py | 3 - python/mozbuild/mozbuild/artifacts.py | 134 +- .../mozbuild/backend/configenvironment.py | 2 +- python/mozbuild/mozbuild/base.py | 2 +- .../mozbuild/mozbuild/configure/__init__.py | 12 +- python/mozbuild/mozbuild/configure/options.py | 16 +- python/mozbuild/mozbuild/frontend/context.py | 2 +- .../mozbuild/mozbuild/frontend/gyp_reader.py | 2 +- .../mozbuild/test/configure/common.py | 1 + .../mozbuild/mozbuild/test/configure/lint.py | 1 + .../test/configure/test_toolchain_helpers.py | 2 +- python/mozbuild/mozbuild/util.py | 4 +- python/mozbuild/mozpack/copier.py | 4 +- python/mozbuild/mozpack/files.py | 14 +- python/mozbuild/mozpack/mozjar.py | 2 +- python/mozperftest/perfdocs/config.yml | 4 +- .../mozversioncontrol/factory.py | 2 +- .../mozversioncontrol/repo/jj.py | 6 +- python/sites/mach.txt | 2 +- remote/cdp/targets/TabTarget.sys.mjs | 22 - security/ct/CTKnownLogs.h | 2 +- security/manager/ssl/StaticHPKPins.h | 2 +- security/manager/ssl/nsSTSPreloadList.inc | 450 +- security/manager/ssl/tests/unit/xpcshell.toml | 5 +- security/manager/tools/log_list.json | 4 +- security/moz.build | 2 +- .../dumps/security-state/intermediates.json | 452 +- services/settings/static-dumps/main/moz.build | 12 +- services/sync/modules/engines/tabs.sys.mjs | 7 +- services/sync/tests/unit/xpcshell.toml | 6 +- servo/components/style/Cargo.toml | 2 +- storage/moz.build | 5 + storage/mozStorageConnection.cpp | 3 + storage/test/unit/test_storage_ext_vec.js | 151 + storage/test/unit/xpcshell.toml | 3 + supply-chain/audits.toml | 40 - supply-chain/config.toml | 4 - supply-chain/imports.lock | 40 +- taskcluster/config.yml | 5 + .../docker/android-ui-tests/Dockerfile | 6 +- taskcluster/docs/parameters.rst | 4 + taskcluster/gecko_taskgraph/decision.py | 7 +- taskcluster/gecko_taskgraph/parameters.py | 1 + taskcluster/gecko_taskgraph/target_tasks.py | 20 +- .../gecko_taskgraph/test/test_decision.py | 6 + .../gecko_taskgraph/transforms/bootstrap.py | 2 +- .../gecko_taskgraph/transforms/task.py | 28 +- .../transforms/test/__init__.py | 2 +- .../gecko_taskgraph/transforms/test/worker.py | 1 - taskcluster/gecko_taskgraph/util/hg.py | 6 +- taskcluster/kinds/bootstrap/kind.yml | 51 +- .../kinds/test/browsertime-desktop.yml | 13 +- taskcluster/kinds/test/test-platforms.yml | 5 + taskcluster/kinds/test/xpcshell.yml | 3 +- .../mozbase/mozfile/tests/test_tempfile.py | 2 +- testing/mozbase/mozlog/mozlog/commandline.py | 2 +- .../mozlog/mozlog/formatters/machformatter.py | 2 +- .../mozlog/mozlog/formatters/tbplformatter.py | 2 +- .../mozbase/mozlog/mozlog/formatters/xunit.py | 2 +- testing/mozbase/mozlog/mozlog/logtypes.py | 2 +- .../mozlog/mozlog/pytest_mozlog/plugin.py | 2 +- .../mozbase/mozlog/mozlog/scripts/unstable.py | 2 +- .../mozprocess/mozprocess/processhandler.py | 2 +- testing/mozbase/mozprocess/mozprocess/qijo.py | 2 +- .../mozproxy/mozproxy/backends/mitm/mitm.py | 2 +- testing/mozbase/moztest/moztest/results.py | 4 +- testing/mozharness/mozharness/base/script.py | 2 +- .../mozharness/mozilla/repo_manipulation.py | 2 +- .../mozharness/mozilla/testing/talos.py | 2 +- testing/mozharness/requirements.txt | 28 - testing/perfdocs/generated/browsertime.rst | 8 +- testing/perfdocs/generated/mach-try-perf.rst | 14 +- testing/perfdocs/generated/mozperftest.rst | 6 +- testing/perfdocs/generated/raptor.rst | 382 + .../perfdocs/generated/standard-workflow.rst | 2 +- .../mach-try-perf/perfdocs/index.rst | 14 +- .../perfdocs/standard-workflow.rst | 2 +- .../raptor/raptor/perfdocs/browsertime.rst | 8 +- testing/talos/talos/ffsetup.py | 4 +- .../deeply-nested-grid-1.html | 76 + .../deeply-nested-grid-2.html | 75 + .../perf_reftest_singletons.manifest | 2 + .../meta/acid/acid2/reftest.html.ini | 1 + ...er_for_document_cookie.https.window.js.ini | 4 +- .../first-letter-punctuation-048.xht.ini | 2 + .../first-letter-punctuation-346.xht.ini | 2 + .../first-letter-punctuation-347.xht.ini | 2 + .../first-letter-punctuation-348.xht.ini | 2 + .../first-letter-punctuation-349.xht.ini | 2 + .../first-letter-punctuation-350.xht.ini | 2 + .../first-letter-punctuation-351.xht.ini | 2 + .../first-letter-punctuation-352.xht.ini | 2 + .../first-letter-punctuation-353.xht.ini | 2 + .../first-letter-punctuation-354.xht.ini | 2 + .../first-letter-punctuation-355.xht.ini | 2 + .../first-letter-punctuation-356.xht.ini | 2 + .../first-letter-punctuation-357.xht.ini | 2 + .../first-letter-punctuation-359.xht.ini | 2 + .../first-letter-punctuation-360.xht.ini | 2 + .../first-letter-punctuation-361.xht.ini | 2 + .../first-letter-punctuation-362.xht.ini | 2 + .../first-letter-punctuation-363.xht.ini | 2 + .../first-letter-punctuation-364.xht.ini | 2 + .../first-letter-punctuation-365.xht.ini | 2 + .../first-letter-punctuation-366.xht.ini | 2 + .../first-letter-punctuation-367.xht.ini | 2 + .../first-letter-punctuation-368.xht.ini | 2 + .../first-letter-punctuation-369.xht.ini | 2 + .../first-letter-punctuation-370.xht.ini | 2 + .../first-letter-punctuation-371.xht.ini | 2 + .../first-letter-punctuation-372.xht.ini | 2 + .../first-letter-punctuation-373.xht.ini | 2 + .../first-letter-punctuation-374.xht.ini | 2 + .../first-letter-punctuation-375.xht.ini | 2 + .../first-letter-punctuation-376.xht.ini | 2 + .../first-letter-punctuation-377.xht.ini | 2 + .../first-letter-punctuation-378.xht.ini | 2 + .../first-letter-punctuation-379.xht.ini | 2 + .../first-letter-punctuation-380.xht.ini | 2 + .../first-letter-punctuation-381.xht.ini | 2 + .../first-letter-punctuation-382.xht.ini | 2 + .../first-letter-punctuation-383.xht.ini | 2 + .../first-letter-punctuation-384.xht.ini | 2 + .../first-letter-punctuation-385.xht.ini | 2 + .../first-letter-punctuation-386.xht.ini | 2 + .../first-letter-punctuation-387.xht.ini | 2 + .../first-letter-punctuation-388.xht.ini | 2 + .../first-letter-punctuation-389.xht.ini | 2 + .../first-letter-punctuation-390.xht.ini | 2 + .../first-letter-punctuation-391.xht.ini | 2 + .../first-letter-punctuation-392.xht.ini | 2 + .../first-letter-punctuation-393.xht.ini | 2 + .../first-letter-punctuation-395.xht.ini | 2 + .../first-letter-punctuation-396.xht.ini | 2 + .../first-letter-punctuation-397.xht.ini | 2 + .../first-letter-punctuation-398.xht.ini | 2 + .../first-letter-punctuation-399.xht.ini | 2 + .../first-letter-punctuation-400.xht.ini | 2 + .../first-letter-punctuation-401.xht.ini | 2 + .../first-letter-punctuation-402.xht.ini | 2 + .../first-letter-punctuation-403.xht.ini | 2 + .../first-letter-punctuation-404.xht.ini | 2 + .../first-letter-punctuation-405.xht.ini | 2 + .../first-letter-punctuation-406.xht.ini | 2 + .../first-letter-punctuation-407.xht.ini | 2 + .../first-letter-punctuation-408.xht.ini | 2 + .../first-letter-punctuation-409.xht.ini | 2 + .../first-letter-punctuation-410.xht.ini | 2 + .../first-letter-punctuation-411.xht.ini | 2 + .../first-letter-punctuation-412.xht.ini | 2 + .../svg/mix-blend-mode-in-svg-image.html.ini | 2 + .../corner-shape-render-fuzzy.html.ini | 6 + .../kannada/css3-counter-styles-128.html.ini | 2 + .../resnap-on-reconstructing-frame.html.ini | 5 +- .../serialize-consecutive-tokens.html.ini | 3 + .../block-with-overflowing-text.html.ini | 2 - .../capture-with-opacity-zero-child.html.ini | 2 - ...ture-with-visibility-hidden-child.html.ini | 2 - ...with-visibility-mixed-descendants.html.ini | 2 - ...der-box-on-child-of-named-element.html.ini | 2 - ...child-with-transparent-background.html.ini | 2 - .../content-with-inline-child.html.ini | 2 - .../element-with-overflow.html.ini | 3 +- ...al-box-with-overflow-children-new.html.ini | 2 - ...al-box-with-overflow-children-old.html.ini | 2 - .../inline-child-with-filter.html.ini | 4 - ...inline-child-with-overflow-shadow.html.ini | 5 +- ...f-viewport-partially-onscreen-old.html.ini | 3 +- ...w-viewport-partially-onscreen-new.html.ini | 3 - ...f-viewport-partially-onscreen-old.html.ini | 1 - .../new-content-captures-clip-path.html.ini | 2 +- .../new-content-captures-spans.html.ini | 3 - .../new-content-preserve-3d-ancestor.html.ini | 2 + .../new-content-with-overflow.html.ini | 2 - .../no-root-capture.html.ini | 2 - ...d-content-captures-different-size.html.ini | 4 - .../old-content-is-inline.html.ini | 1 - .../old-content-with-overflow.html.ini | 2 - ...rflowing-text-and-box-decorations.html.ini | 4 +- ...span-with-overflowing-text-hidden.html.ini | 3 - .../span-with-overflowing-text.html.ini | 2 - .../textencoder-utf16-surrogates.any.js.ini | 4 +- .../window-history.https.sub.html.ini | 25 +- .../pointerdown-add-overflow-hidden.html.ini | 3 + ...ndbox_navigate_history_go_forward.html.ini | 2 - testing/web-platform/meta/mozilla-sync | 2 +- .../iframe-sequence-of-events.html.ini | 29 +- .../cache-storage-buckets.https.any.js.ini | 2 +- .../prerender-target-hint.https.html.ini | 2 + ...glength-animation-LengthModeOther.html.ini | 2 +- .../meta/wasm/jsapi/idlharness.any.js.ini | 32 +- .../to-fixed-length-buffer-shared.any.js.ini | 13 +- .../memory/to-fixed-length-buffer.any.js.ini | 12 +- .../to-resizable-buffer-shared.any.js.ini | 36 +- .../memory/to-resizable-buffer.any.js.ini | 24 +- .../get_element_text/user_prompts.py.ini | 4 + .../tests/interop/beforeunload_prompt.py.ini | 4 +- .../meta/webrtc/simulcast/h264.https.html.ini | 6 - .../Worker-timeout-decreasing-order.html.ini | 5 +- .../adapter/requestAdapter/cts.https.html.ini | 1 - .../copyTextureToTexture/cts.https.html.ini | 1 + .../image_copy/cts.https.html.ini | 1186 +- .../image_copy__mip_levels/cts.https.html.ini | 946 + .../clear_value/cts.https.html.ini | 39 +- .../depth_clip_clamp/cts.https.html.ini | 13 +- .../cmds/render/draw/cts.https.html.ini | 6 +- .../cts.https.html.ini | 12 + .../layout_related/cts.https.html.ini | 494 +- .../device_lost/destroy/cts.https.html.ini | 25 + .../builtin/subgroupAdd/cts.https.html.ini | 68 +- .../builtin/subgroupMul/cts.https.html.ini | 12 +- .../builtin/textureGather/cts.https.html.ini | 2 + .../builtin/textureLoad/cts.https.html.ini | 2 + .../textureSampleBias/cts.https.html.ini | 43305 ---------------- .../textureSampleCompare/cts.https.html.ini | 28 +- .../textureSampleLevel/cts.https.html.ini | 13 + .../subgroupBitwise/cts.https.html.ini | 20 +- .../command_buffer/image_copy/cts.https.html | 1 - .../image_copy__mip_levels/cts.https.html | 37 + .../corner-shape-render-fuzzy.html | 2 + .../clip-path-animation-svg-zoom.html | 1 + .../serialize-consecutive-tokens.html | 5 + .../CSSTransition-startTime.tentative.html | 4 - .../inline-child-with-filter.html | 1 + .../close_noopener_beforeunload-1.html | 8 - .../close_noopener_beforeunload-2.html | 6 - .../close_noopener_beforeunload.html | 34 +- .../open-close/script-closable.html | 85 + .../open-close/self-close.html | 26 + ...mousedown-move-inner-when-dragging-1.html} | 0 .../mousedown-move-inner-when-dragging-2.html | 47 + .../pointerdown-add-overflow-hidden.html | 42 + .../static-router-resource-timing.https.html | 5 + .../deduped-and-sorted-tags.https.html | 208 +- .../prerender-target-hint.https.html | 65 + .../webdriver/bidi/modules/emulation.py | 10 +- .../wptrunner/wptrunner/browsers/chrome.py | 4 + testing/xpcshell/runxpcshelltests.py | 4 +- testing/xpcshell/selftest.py | 2 +- third_party/fmt/moz.build | 3 +- .../AUTHORS.md | 0 .../LICENSE | 0 .../METADATA | 6 +- .../RECORD | 20 +- .../WHEEL | 0 .../entry_points.txt | 0 .../top_level.txt | 0 .../python/glean_parser/glean_parser/lint.py | 9 - .../glean_parser/glean_parser/parser.py | 75 +- .../schemas/metrics.2-0-0.schema.yaml | 2 +- third_party/python/pyproject.toml | 2 +- third_party/python/requirements.txt | 6 +- third_party/python/uv.lock | 8 +- third_party/python/uv.lock.hash | 2 +- .../rust/glean-core/.cargo-checksum.json | 2 +- third_party/rust/glean-core/Cargo.toml | 4 +- third_party/rust/glean-core/src/core/mod.rs | 77 +- .../rust/glean-core/src/core_metrics.rs | 111 + third_party/rust/glean-core/src/glean.udl | 24 + .../rust/glean-core/src/internal_metrics.rs | 60 + third_party/rust/glean-core/src/lib.rs | 74 +- .../rust/glean-core/src/lib_unit_tests.rs | 52 + .../rust/glean-core/src/metrics/labeled.rs | 4 +- third_party/rust/glean-core/src/ping/mod.rs | 32 +- .../rust/glean-core/src/traits/labeled.rs | 2 +- third_party/rust/glean-core/tests/labeled.rs | 2 +- .../rust/glean-core/tests/ping_maker.rs | 68 + third_party/rust/glean/.cargo-checksum.json | 2 +- third_party/rust/glean/Cargo.lock | 10 +- third_party/rust/glean/Cargo.toml | 4 +- third_party/rust/glean/src/lib.rs | 30 +- third_party/rust/glean/src/test.rs | 46 + .../rust/itertools/.cargo-checksum.json | 2 +- third_party/rust/itertools/CHANGELOG.md | 190 + third_party/rust/itertools/CONTRIBUTING.md | 189 + third_party/rust/itertools/Cargo.lock | 740 + third_party/rust/itertools/Cargo.toml | 162 +- third_party/rust/itertools/README.md | 17 +- third_party/rust/itertools/benches/bench1.rs | 290 +- .../rust/itertools/benches/combinations.rs | 10 +- .../rust/itertools/benches/extra/mod.rs | 2 - .../rust/itertools/benches/extra/zipslices.rs | 188 - .../itertools/benches/fold_specialization.rs | 16 +- .../rust/itertools/benches/k_smallest.rs | 61 + .../rust/itertools/benches/powerset.rs | 67 +- .../rust/itertools/benches/specializations.rs | 669 + .../benches/{tree_fold1.rs => tree_reduce.rs} | 112 +- third_party/rust/itertools/benches/tuples.rs | 27 +- third_party/rust/itertools/clippy.toml | 1 - third_party/rust/itertools/examples/iris.rs | 41 +- .../rust/itertools/src/adaptors/coalesce.rs | 123 +- .../rust/itertools/src/adaptors/map.rs | 20 +- .../rust/itertools/src/adaptors/mod.rs | 960 +- .../itertools/src/adaptors/multi_product.rs | 331 +- .../rust/itertools/src/combinations.rs | 320 +- .../src/combinations_with_replacement.rs | 171 +- third_party/rust/itertools/src/concat_impl.rs | 20 +- .../rust/itertools/src/cons_tuples_impl.rs | 57 +- third_party/rust/itertools/src/diff.rs | 71 +- .../rust/itertools/src/duplicates_impl.rs | 12 +- .../rust/itertools/src/either_or_both.rs | 314 +- .../rust/itertools/src/exactly_one_err.rs | 59 +- third_party/rust/itertools/src/extrema_set.rs | 1 + third_party/rust/itertools/src/flatten_ok.rs | 54 +- third_party/rust/itertools/src/format.rs | 113 +- third_party/rust/itertools/src/free.rs | 137 +- third_party/rust/itertools/src/group_map.rs | 18 +- third_party/rust/itertools/src/groupbylazy.rs | 252 +- .../rust/itertools/src/grouping_map.rs | 349 +- third_party/rust/itertools/src/impl_macros.rs | 7 +- third_party/rust/itertools/src/intersperse.rs | 94 +- third_party/rust/itertools/src/iter_index.rs | 116 + third_party/rust/itertools/src/k_smallest.rs | 144 +- third_party/rust/itertools/src/kmerge_impl.rs | 102 +- third_party/rust/itertools/src/lazy_buffer.rs | 48 +- third_party/rust/itertools/src/lib.rs | 2047 +- third_party/rust/itertools/src/merge_join.rs | 397 +- third_party/rust/itertools/src/minmax.rs | 45 +- .../rust/itertools/src/multipeek_impl.rs | 49 +- third_party/rust/itertools/src/next_array.rs | 269 + third_party/rust/itertools/src/pad_tail.rs | 58 +- third_party/rust/itertools/src/peek_nth.rs | 94 +- .../rust/itertools/src/peeking_take_while.rs | 99 +- .../rust/itertools/src/permutations.rs | 329 +- third_party/rust/itertools/src/powerset.rs | 129 +- .../itertools/src/process_results_impl.rs | 95 +- .../rust/itertools/src/put_back_n_impl.rs | 16 +- third_party/rust/itertools/src/rciter_impl.rs | 27 +- third_party/rust/itertools/src/repeatn.rs | 48 +- third_party/rust/itertools/src/size_hint.rs | 39 +- third_party/rust/itertools/src/sources.rs | 98 +- .../itertools/src/take_while_inclusive.rs | 96 + third_party/rust/itertools/src/tee.rs | 37 +- third_party/rust/itertools/src/tuple_impl.rs | 252 +- third_party/rust/itertools/src/unique_impl.rs | 117 +- third_party/rust/itertools/src/unziptuple.rs | 2 +- .../rust/itertools/src/with_position.rs | 94 +- third_party/rust/itertools/src/zip_eq_impl.rs | 29 +- third_party/rust/itertools/src/zip_longest.rs | 82 +- third_party/rust/itertools/src/ziptuple.rs | 13 +- .../itertools/tests/adaptors_no_collect.rs | 11 +- third_party/rust/itertools/tests/laziness.rs | 283 + .../rust/itertools/tests/macros_hygiene.rs | 14 + .../rust/itertools/tests/merge_join.rs | 69 +- .../itertools/tests/peeking_take_while.rs | 19 + third_party/rust/itertools/tests/quick.rs | 572 +- .../rust/itertools/tests/specializations.rs | 498 +- third_party/rust/itertools/tests/test_core.rs | 180 +- third_party/rust/itertools/tests/test_std.rs | 831 +- third_party/rust/itertools/tests/zip.rs | 35 +- third_party/rust/suggest/.cargo-checksum.json | 2 +- third_party/rust/suggest/src/db.rs | 19 +- third_party/rust/suggest/src/schema.rs | 6 +- third_party/rust/suggest/src/store.rs | 151 +- third_party/rust/suggest/src/suggestion.rs | 4 +- third_party/sqlite3/ext/lib.symbols | 1 + third_party/sqlite3/ext/moz.build | 1 + .../sqlite3/ext/sqlite-vec/LICENSE-MIT | 21 + .../sqlite3/ext/sqlite-vec/VERSION.txt | 1 + third_party/sqlite3/ext/sqlite-vec/moz.yaml | 50 + .../sqlite3/ext/sqlite-vec/sqlite-vec.c | 9751 ++++ .../sqlite3/ext/sqlite-vec/sqlite-vec.h | 41 + third_party/sqlite3/ext/sqlite-vec/vendor.sh | 28 + third_party/sqlite3/readme.txt | 11 + ...haracteristicsCanvasRenderingChild.sys.mjs | 9 +- .../antitracking/test/browser/browser.toml | 3 + .../backgroundhangmonitor/tests/xpcshell.toml | 1 + .../CredentialChooserService.sys.mjs | 4 +- .../components/doh/DoHConfig.sys.mjs | 34 +- .../components/doh/DoHController.sys.mjs | 6 +- .../components/doh/DoHHeuristics.sys.mjs | 6 +- .../components/doh/DoHTestUtils.sys.mjs | 0 .../components/doh/TRRPerformance.sys.mjs | 9 + .../components/doh/metrics.yaml | 0 {browser => toolkit}/components/doh/moz.build | 2 +- .../components/doh/test/browser/browser.toml | 1 + .../doh/test/browser/browser_cleanFlow.js | 0 .../doh/test/browser/browser_dirtyEnable.js | 0 .../doh/test/browser/browser_doh_region.js | 0 .../browser/browser_doorhangerUserReject.js | 0 .../test/browser/browser_platformDetection.js | 2 +- .../test/browser/browser_policyOverride.js | 0 .../test/browser/browser_providerSteering.js | 0 .../browser_remoteSettings_newProfile.js | 0 .../browser/browser_remoteSettings_rollout.js | 0 .../doh/test/browser/browser_rollback.js | 0 .../browser/browser_throttle_heuristics.js | 0 .../doh/test/browser/browser_trrSelect.js | 0 .../browser/browser_trrSelection_disable.js | 0 .../test/browser/browser_userInterference.js | 0 .../components/doh/test/browser/head.js | 6 +- .../components/doh/test/unit/head.js | 15 +- .../doh/test/unit/test_DNSLookup.js | 0 .../doh/test/unit/test_LookupAggregator.js | 33 +- .../components/doh/test/unit/test_TRRRacer.js | 41 +- .../doh/test/unit/test_heuristics.js | 2 +- .../components/doh/test/unit/xpcshell.toml | 0 .../formautofill/FormAutofillChild.sys.mjs | 10 +- .../shared/FormAutofillHandler.sys.mjs | 56 +- .../glean/api/src/private/labeled.rs | 2 +- .../glean/bindings/private/Labeled.h | 6 +- toolkit/components/glean/metrics_index.py | 3 +- toolkit/components/glean/src/lib.rs | 94 + .../tests/browser/browser_labeled_gifft.js | 3 +- .../components/glean/tests/gtest/TestFog.cpp | 3 +- .../xpcshell/test_AttributionDistribution.js | 69 + .../glean/tests/xpcshell/test_GIFFT.js | 9 +- .../glean/tests/xpcshell/test_GIFFTIPC.js | 11 +- .../glean/tests/xpcshell/test_Glean.js | 12 +- .../glean/tests/xpcshell/test_GleanIPC.js | 2 +- .../glean/tests/xpcshell/test_JOG.js | 12 +- .../glean/tests/xpcshell/test_JOGIPC.js | 4 +- .../glean/tests/xpcshell/xpcshell.toml | 3 + toolkit/components/glean/xpcom/FOG.cpp | 137 + toolkit/components/glean/xpcom/nsIFOG.idl | 43 + toolkit/components/moz.build | 1 + .../components/nimbus/ExperimentAPI.sys.mjs | 37 +- .../components/nimbus/FeatureManifest.yaml | 7 - .../nimbus/lib/ExperimentManager.sys.mjs | 11 +- .../browser/browser_experimentapi_child.js | 108 +- .../test/browser/browser_nimbus_telemetry.js | 19 +- ...rowser_remotesettings_experiment_enroll.js | 4 +- .../nimbus/test/unit/test_ExperimentAPI.js | 80 - .../unit/test_ExperimentManager_unenroll.js | 63 + .../nimbus/test/unit/test_prefFlips.js | 2 + .../components/nimbus/test/unit/xpcshell.toml | 1 + .../passwordmgr/test/browser/browser.toml | 3 + .../components/pdfjs/content/build/pdf.mjs | 30 +- .../pdfjs/content/build/pdf.scripting.mjs | 4 +- .../pdfjs/content/build/pdf.worker.mjs | 51 +- .../content/web/images/messageBar_info.svg | 3 + .../pdfjs/content/web/viewer-geckoview.css | 2 +- .../pdfjs/content/web/viewer-geckoview.mjs | 6 +- .../components/pdfjs/content/web/viewer.css | 2 +- .../components/pdfjs/content/web/viewer.mjs | 6 +- toolkit/components/pdfjs/moz.yaml | 4 +- .../places/BookmarkHTMLUtils.sys.mjs | 33 +- toolkit/components/places/FaviconHelpers.cpp | 77 - toolkit/components/places/FaviconHelpers.h | 57 - .../places/PageIconProtocolHandler.cpp | 228 +- .../places/PageIconProtocolHandler.h | 6 +- .../places/PlacesFrecencyRecalculator.sys.mjs | 5 +- toolkit/components/places/PlacesUtils.sys.mjs | 31 - .../components/places/nsFaviconService.cpp | 47 - .../components/places/nsIFaviconService.idl | 52 - .../places/nsINavHistoryService.idl | 8 + toolkit/components/places/nsNavHistory.cpp | 8 + .../places/tests/PlacesTestUtils.sys.mjs | 16 + ...ser_favicon_privatebrowsing_perwindowpb.js | 12 +- .../tests/expiration/test_debug_expiration.js | 25 +- .../places/tests/favicons/head_favicons.js | 38 +- .../tests/favicons/test_copyFavicons.js | 12 +- .../tests/favicons/test_expireAllFavicons.js | 4 +- .../favicons/test_expire_migrated_icons.js | 6 +- .../favicons/test_expire_on_new_icons.js | 8 +- .../favicons/test_favicons_conversions.js | 38 +- .../favicons/test_getFaviconDataForPage.js | 457 - .../tests/favicons/test_getFaviconForPage.js | 571 +- .../favicons/test_getFaviconURLForPage.js | 237 - .../tests/favicons/test_heavy_favicon.js | 2 +- .../tests/favicons/test_multiple_frames.js | 4 +- .../places/tests/favicons/test_root_icons.js | 32 +- .../tests/favicons/test_setFaviconForPage.js | 43 +- .../places/tests/favicons/test_svg_favicon.js | 28 +- .../places/tests/favicons/xpcshell.toml | 4 - .../components/places/tests/head_common.js | 32 - .../test_preventive_maintenance.js | 8 +- .../places/tests/unit/test_bookmarks_html.js | 23 +- .../tests/unit/test_bookmarks_html_corrupt.js | 21 +- .../places/tests/unit/test_bookmarks_json.js | 9 +- .../unit/test_frecency_pages_alternative.js | 364 - ...est_frecency_pages_alternative_disabled.js | 111 + ...test_frecency_pages_alternative_enabled.js | 282 + .../places/tests/unit/xpcshell.toml | 5 +- toolkit/components/reader/AboutReader.sys.mjs | 8 +- toolkit/components/reader/ReaderMode.sys.mjs | 11 +- .../content/usercharacteristics.js | 22 +- .../nsUserCharacteristics.cpp | 6 - .../datasources/LoginDataSource.sys.mjs | 49 +- ...r_passwords_export_success_notification.js | 18 +- ...owser_passwords_remove_all_notification.js | 59 +- .../megalist/content/tests/browser/head.js | 30 + .../app/TelemetryEnvironment.sys.mjs | 29 +- .../unit/TelemetryEnvironmentTesting.sys.mjs | 32 + .../components/generated/RustSuggest.sys.mjs | 172 +- .../components/generated/RustTabs.sys.mjs | 50 +- .../generated/RustWebextstorage.sys.mjs | 44 +- .../fixtures/generated/RustArithmetic.sys.mjs | 8 +- .../generated/RustCustomTypes.sys.mjs | 2 +- .../generated/RustExternalTypes.sys.mjs | 6 +- .../generated/RustFixtureCallbacks.sys.mjs | 6 +- .../fixtures/generated/RustFutures.sys.mjs | 50 +- .../fixtures/generated/RustGeometry.sys.mjs | 4 +- .../fixtures/generated/RustRefcounts.sys.mjs | 6 +- .../fixtures/generated/RustRondpoint.sys.mjs | 120 +- .../fixtures/generated/RustSprites.sys.mjs | 12 +- .../fixtures/generated/RustTodolist.sys.mjs | 30 +- .../RustUniffiTraitInterfaces.sys.mjs | 6 +- .../uniffi-js/GeneratedScaffolding.cpp | 552 +- .../viewsource/test/browser/browser.toml | 5 +- .../widgets/moz-button/moz-button.figma.ts | 79 +- toolkit/crashreporter/test/moz.build | 2 +- toolkit/library/moz.build | 4 +- toolkit/modules/NewTabUtils.sys.mjs | 19 +- toolkit/modules/tests/xpcshell/xpcshell.toml | 5 +- toolkit/moz.configure | 4 +- .../shared/design-system/design-tokens.json | 36 +- .../shared/design-system/tokens-brand.css | 6 + .../shared/design-system/tokens-platform.css | 6 + .../shared/design-system/tokens-shared.css | 4 - .../shared/design-system/tokens-storybook.mjs | 28 +- tools/@types/lib.gecko.glean.d.ts | 8 + tools/fuzzing/ipc/IPCFuzzController.cpp | 2 + tools/fuzzing/nyx/Nyx.cpp | 14 + tools/fuzzing/nyx/Nyx.h | 1 + tools/fuzzing/smoke/grizzly_requirements.in | 2 + tools/fuzzing/smoke/grizzly_requirements.txt | 98 +- tools/lint/android/lints.py | 61 +- tools/rusttests/config/mozconfigs/common | 4 +- .../config/mozconfigs/linux64/rusttests | 3 - tools/tryselect/selectors/perf.py | 18 +- .../selectors/perfselector/classification.py | 28 +- tools/tryselect/test/test_perf.py | 19 +- widget/android/nsWindow.cpp | 5 +- widget/gtk/nsWindow.cpp | 3 +- widget/nsBaseWidget.h | 5 +- widget/nsIWidget.h | 14 +- ...window_composition_text_querycontent.xhtml | 32 + widget/windows/WinUtils.cpp | 141 +- widget/windows/WinUtils.h | 28 - widget/windows/WindowsUIUtils.cpp | 2 +- xpcom/threads/TimerThread.cpp | 59 +- 1122 files changed, 49246 insertions(+), 59068 deletions(-) create mode 100644 aclocal.m4 create mode 100644 browser/components/attribution/metrics.yaml create mode 100644 browser/components/search/test/browser/telemetry/browser_search_telemetry_searchform.js create mode 100644 browser/extensions/pictureinpicture/video-wrappers/zdf.js create mode 100644 build/autoconf/acgeneral.m4 create mode 100644 build/autoconf/acoldnames.m4 create mode 100644 build/autoconf/acspecific.m4 create mode 100644 build/autoconf/altoptions.m4 create mode 100644 build/autoconf/autoconf.m4 create mode 100644 build/autoconf/autoconf.sh create mode 100644 build/autoconf/config.status.m4 create mode 100644 build/autoconf/hooks.m4 create mode 100644 build/moz.configure/old.configure create mode 100644 build/rust/itertools/Cargo.toml create mode 100644 build/rust/itertools/lib.rs create mode 100644 dom/media/platforms/apple/AppleUtils.cpp create mode 100644 dom/quota/test/xpcshell/test_temporaryStorageEviction.js create mode 100644 dom/webgpu/tests/cts/vendor/src/test_split.rs rename dom/webgpu/{ => tests}/mochitest/mochitest-no-pref.toml (100%) rename dom/webgpu/{ => tests}/mochitest/mochitest-resistfingerprinting.toml (100%) rename dom/webgpu/{ => tests}/mochitest/mochitest.toml (100%) rename dom/webgpu/{ => tests}/mochitest/perftest.toml (100%) rename dom/webgpu/{ => tests}/mochitest/test_basic_canvas.worker.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_basic_canvas.worker.js (100%) rename dom/webgpu/{ => tests}/mochitest/test_buffer_mapping.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_buffer_mapping_invalid_device.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_buffer_mapping_overlapping_views.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_command_buffer_creation.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_compilation_message_pos.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_context_configure.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_core_features_and_limits.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_device_creation.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_device_lost.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_disabled.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_double_encoder_finish.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_enabled.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_encoder_cycle_collection.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_error_scope.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_insecure_context.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_navigator_gpu_not_replaceable.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_queue_copyExternalImageToTexture.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_queue_write.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_queue_write_invalid_device.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_queue_write_perf.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_rfp_clamp_limits_off.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_rfp_clamp_limits_on.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_set_bind_group_null.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_shared_array_buffer.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_submit_compute_empty.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_submit_render_empty.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_submit_render_empty.worker.html (100%) rename dom/webgpu/{ => tests}/mochitest/test_submit_render_empty.worker.js (100%) rename dom/webgpu/{ => tests}/mochitest/worker_wrapper.js (100%) create mode 100644 js/src/aclocal.m4 create mode 100644 js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-cloning.js create mode 100644 js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-shared.js create mode 100644 js/src/jit-test/tests/wasm/wasm-resizablearraybuffer.js create mode 100644 js/src/old-configure.in create mode 100644 js/sub.configure create mode 100644 mobile/android/android-components/components/compose/base/src/main/java/mozilla/components/compose/base/progressbar/AnimatedProgressBar.kt create mode 100644 mobile/android/android-components/components/compose/base/src/main/res/values-bg/strings.xml create mode 100644 mobile/android/android-components/components/compose/base/src/main/res/values-eo/strings.xml create mode 100644 mobile/android/android-components/components/compose/base/src/main/res/values-gl/strings.xml create mode 100644 mobile/android/android-components/components/compose/base/src/main/res/values-pl/strings.xml create mode 100644 mobile/android/android-components/components/compose/cfr/src/main/res/values-tl/strings.xml delete mode 100644 mobile/android/fenix/app/src/main/java/org/mozilla/fenix/MozillaOnlineHomeActivity.kt create mode 100644 mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/store/BrowserScreenAction.kt create mode 100644 mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/store/BrowserScreenMiddleware.kt create mode 100644 mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/store/BrowserScreenState.kt create mode 100644 mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/store/BrowserScreenStore.kt delete mode 100644 mobile/android/fenix/app/src/main/res/drawable/ic_baidu.webp delete mode 100644 mobile/android/fenix/app/src/main/res/drawable/ic_jd.webp delete mode 100644 mobile/android/fenix/app/src/main/res/drawable/ic_meituan.webp delete mode 100644 mobile/android/fenix/app/src/main/res/drawable/ic_pdd.webp delete mode 100644 mobile/android/fenix/app/src/main/res/drawable/ic_tc.webp create mode 100644 mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/store/BrowserScreenMiddlewareTest.kt create mode 100644 mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/store/BrowserScreenStoreTest.kt create mode 100644 old-configure.in create mode 100644 storage/test/unit/test_storage_ext_vec.js delete mode 100644 testing/mozharness/requirements.txt create mode 100644 testing/talos/talos/tests/perf-reftest-singletons/deeply-nested-grid-1.html create mode 100644 testing/talos/talos/tests/perf-reftest-singletons/deeply-nested-grid-2.html create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-048.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-346.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-347.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-348.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-349.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-350.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-351.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-352.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-353.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-354.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-355.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-356.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-357.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-359.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-360.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-361.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-362.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-363.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-364.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-365.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-366.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-367.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-368.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-369.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-370.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-371.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-372.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-373.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-374.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-375.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-376.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-377.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-378.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-379.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-380.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-381.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-382.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-383.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-384.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-385.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-386.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-387.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-388.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-389.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-390.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-391.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-392.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-393.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-395.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-396.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-397.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-398.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-399.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-400.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-401.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-402.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-403.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-404.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-405.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-406.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-407.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-408.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-409.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-410.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-411.xht.ini create mode 100644 testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-412.xht.ini create mode 100644 testing/web-platform/meta/css/compositing/svg/mix-blend-mode-in-svg-image.html.ini create mode 100644 testing/web-platform/meta/css/css-counter-styles/kannada/css3-counter-styles-128.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/block-with-overflowing-text.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/capture-with-opacity-zero-child.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-hidden-child.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-mixed-descendants.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/content-with-child-with-transparent-background.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/content-with-inline-child.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-new.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-old.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/inline-child-with-filter.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/new-content-captures-spans.html.ini create mode 100644 testing/web-platform/meta/css/css-view-transitions/new-content-preserve-3d-ancestor.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/new-content-with-overflow.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/no-root-capture.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/old-content-captures-different-size.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/old-content-with-overflow.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-hidden.html.ini delete mode 100644 testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text.html.ini create mode 100644 testing/web-platform/meta/html/editing/dnd/platform/pointerdown-add-overflow-hidden.html.ini create mode 100644 testing/web-platform/meta/speculation-rules/speculation-tags/prerender-target-hint.https.html.ini create mode 100644 testing/web-platform/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini delete mode 100644 testing/web-platform/meta/webrtc/simulcast/h264.https.html.ini create mode 100644 testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html.ini create mode 100644 testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html delete mode 100644 testing/web-platform/tests/html/browsers/the-window-object/open-close/close_noopener_beforeunload-1.html delete mode 100644 testing/web-platform/tests/html/browsers/the-window-object/open-close/close_noopener_beforeunload-2.html create mode 100644 testing/web-platform/tests/html/browsers/the-window-object/open-close/script-closable.html create mode 100644 testing/web-platform/tests/html/browsers/the-window-object/open-close/self-close.html rename testing/web-platform/tests/html/editing/dnd/platform/{mousedown-move-inner-when-dragging.html => mousedown-move-inner-when-dragging-1.html} (100%) create mode 100644 testing/web-platform/tests/html/editing/dnd/platform/mousedown-move-inner-when-dragging-2.html create mode 100644 testing/web-platform/tests/html/editing/dnd/platform/pointerdown-add-overflow-hidden.html create mode 100644 testing/web-platform/tests/speculation-rules/speculation-tags/prerender-target-hint.https.html rename third_party/python/glean_parser/{glean_parser-17.0.1.dist-info => glean_parser-17.1.0.dist-info}/AUTHORS.md (100%) rename third_party/python/glean_parser/{glean_parser-17.0.1.dist-info => glean_parser-17.1.0.dist-info}/LICENSE (100%) rename third_party/python/glean_parser/{glean_parser-17.0.1.dist-info => glean_parser-17.1.0.dist-info}/METADATA (99%) rename third_party/python/glean_parser/{glean_parser-17.0.1.dist-info => glean_parser-17.1.0.dist-info}/RECORD (83%) rename third_party/python/glean_parser/{glean_parser-17.0.1.dist-info => glean_parser-17.1.0.dist-info}/WHEEL (100%) rename third_party/python/glean_parser/{glean_parser-17.0.1.dist-info => glean_parser-17.1.0.dist-info}/entry_points.txt (100%) rename third_party/python/glean_parser/{glean_parser-17.0.1.dist-info => glean_parser-17.1.0.dist-info}/top_level.txt (100%) create mode 100644 third_party/rust/itertools/CONTRIBUTING.md create mode 100644 third_party/rust/itertools/Cargo.lock delete mode 100644 third_party/rust/itertools/benches/extra/mod.rs delete mode 100644 third_party/rust/itertools/benches/extra/zipslices.rs create mode 100644 third_party/rust/itertools/benches/k_smallest.rs create mode 100644 third_party/rust/itertools/benches/specializations.rs rename third_party/rust/itertools/benches/{tree_fold1.rs => tree_reduce.rs} (50%) delete mode 100644 third_party/rust/itertools/clippy.toml create mode 100644 third_party/rust/itertools/src/iter_index.rs create mode 100644 third_party/rust/itertools/src/next_array.rs create mode 100644 third_party/rust/itertools/src/take_while_inclusive.rs create mode 100644 third_party/rust/itertools/tests/laziness.rs create mode 100644 third_party/sqlite3/ext/sqlite-vec/LICENSE-MIT create mode 100644 third_party/sqlite3/ext/sqlite-vec/VERSION.txt create mode 100644 third_party/sqlite3/ext/sqlite-vec/moz.yaml create mode 100644 third_party/sqlite3/ext/sqlite-vec/sqlite-vec.c create mode 100644 third_party/sqlite3/ext/sqlite-vec/sqlite-vec.h create mode 100644 third_party/sqlite3/ext/sqlite-vec/vendor.sh create mode 100644 third_party/sqlite3/readme.txt rename {browser => toolkit}/components/doh/DoHConfig.sys.mjs (94%) rename {browser => toolkit}/components/doh/DoHController.sys.mjs (99%) rename {browser => toolkit}/components/doh/DoHHeuristics.sys.mjs (98%) rename {browser => toolkit}/components/doh/DoHTestUtils.sys.mjs (100%) rename {browser => toolkit}/components/doh/TRRPerformance.sys.mjs (99%) rename {browser => toolkit}/components/doh/metrics.yaml (100%) rename {browser => toolkit}/components/doh/moz.build (92%) rename {browser => toolkit}/components/doh/test/browser/browser.toml (86%) rename {browser => toolkit}/components/doh/test/browser/browser_cleanFlow.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_dirtyEnable.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_doh_region.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_doorhangerUserReject.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_platformDetection.js (98%) rename {browser => toolkit}/components/doh/test/browser/browser_policyOverride.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_providerSteering.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_remoteSettings_newProfile.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_remoteSettings_rollout.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_rollback.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_throttle_heuristics.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_trrSelect.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_trrSelection_disable.js (100%) rename {browser => toolkit}/components/doh/test/browser/browser_userInterference.js (100%) rename {browser => toolkit}/components/doh/test/browser/head.js (98%) rename {browser => toolkit}/components/doh/test/unit/head.js (90%) rename {browser => toolkit}/components/doh/test/unit/test_DNSLookup.js (100%) rename {browser => toolkit}/components/doh/test/unit/test_LookupAggregator.js (88%) rename {browser => toolkit}/components/doh/test/unit/test_TRRRacer.js (87%) rename {browser => toolkit}/components/doh/test/unit/test_heuristics.js (97%) rename {browser => toolkit}/components/doh/test/unit/xpcshell.toml (100%) create mode 100644 toolkit/components/glean/tests/xpcshell/test_AttributionDistribution.js create mode 100644 toolkit/components/pdfjs/content/web/images/messageBar_info.svg delete mode 100644 toolkit/components/places/tests/favicons/test_getFaviconDataForPage.js delete mode 100644 toolkit/components/places/tests/favicons/test_getFaviconURLForPage.js delete mode 100644 toolkit/components/places/tests/unit/test_frecency_pages_alternative.js create mode 100644 toolkit/components/places/tests/unit/test_frecency_pages_alternative_disabled.js create mode 100644 toolkit/components/places/tests/unit/test_frecency_pages_alternative_enabled.js diff --git a/Cargo.lock b/Cargo.lock index a6489d29e07..086c75136f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -423,7 +423,7 @@ dependencies = [ "bitflags 2.9.0", "cexpr", "clang-sys", - "itertools", + "itertools 0.10.999", "lazy_static", "lazycell", "proc-macro2", @@ -1854,7 +1854,7 @@ dependencies = [ [[package]] name = "error-support" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "error-support-macros", "lazy_static", @@ -1866,7 +1866,7 @@ dependencies = [ [[package]] name = "error-support-macros" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "proc-macro2", "quote", @@ -1983,7 +1983,7 @@ dependencies = [ [[package]] name = "firefox-versioning" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "serde_json", "thiserror 1.999.999", @@ -2643,9 +2643,9 @@ dependencies = [ [[package]] name = "glean" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251b9cb685554b96dcf785dba69ce90447006dd6d9229db783336c981c3777e1" +checksum = "95024f4707705270208e36983976cbac235dd7fc33c9f1cb0dee396ec1ce295d" dependencies = [ "crossbeam-channel", "glean-core", @@ -2657,9 +2657,9 @@ dependencies = [ [[package]] name = "glean-core" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49d1d62648ddeed8cb996373046ea45de93f1d1ff956aba054b9304bc305753" +checksum = "5ca0df94fb37669287b77e8aa300913ad1d14426d7f9e443b0ce1185349c817e" dependencies = [ "android_logger", "bincode", @@ -3320,7 +3320,7 @@ dependencies = [ [[package]] name = "interrupt-support" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "lazy_static", "parking_lot", @@ -3393,9 +3393,16 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.5" +version = "0.10.999" +dependencies = [ + "itertools 0.14.0", +] + +[[package]] +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -4176,7 +4183,7 @@ dependencies = [ "futures", "getrandom 0.2.999", "hex", - "itertools", + "itertools 0.10.999", "maybe-async", "mls-rs-codec", "mls-rs-core", @@ -4423,7 +4430,7 @@ dependencies = [ "icu_properties", "idna", "indexmap", - "itertools", + "itertools 0.14.0", "libc", "lmdb-rkv-sys", "log", @@ -5028,7 +5035,7 @@ checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" [[package]] name = "payload-support" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "serde", "serde_derive", @@ -5338,7 +5345,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.999", "proc-macro2", "quote", "syn", @@ -5531,7 +5538,7 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "relevancy" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "base64 0.21.999", @@ -5556,7 +5563,7 @@ dependencies = [ [[package]] name = "remote_settings" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "camino", @@ -5904,7 +5911,7 @@ dependencies = [ [[package]] name = "search" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "error-support", "firefox-versioning", @@ -6195,7 +6202,7 @@ dependencies = [ [[package]] name = "sql-support" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "interrupt-support", "lazy_static", @@ -6316,7 +6323,7 @@ dependencies = [ "gecko-profiler", "icu_segmenter", "indexmap", - "itertools", + "itertools 0.14.0", "itoa", "lazy_static", "log", @@ -6401,7 +6408,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "suggest" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "chrono", @@ -6453,7 +6460,7 @@ dependencies = [ [[package]] name = "sync-guid" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "base64 0.21.999", "rand", @@ -6464,7 +6471,7 @@ dependencies = [ [[package]] name = "sync15" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "error-support", @@ -6504,7 +6511,7 @@ dependencies = [ [[package]] name = "tabs" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "error-support", @@ -6848,7 +6855,7 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "types" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "rusqlite 0.33.0", "serde", @@ -7230,7 +7237,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "viaduct" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "ffi-support", "log", @@ -7400,7 +7407,7 @@ dependencies = [ [[package]] name = "webext-storage" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "error-support", diff --git a/Cargo.toml b/Cargo.toml index a10ecb2377c..2043c9181fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,7 +68,7 @@ uniffi_bindgen = "0.29.1" # Shared across multiple application-services consumers. rusqlite = "0.33.0" # Shared across multiple glean consumers. -glean = "=64.0.1" +glean = "=64.1.1" # Explicitly specify what our profiles use. The opt-level setting here is # a total fiction; see the setup of MOZ_RUST_DEFAULT_FLAGS for what the @@ -220,6 +220,9 @@ ron = { path = "build/rust/ron" } # Patch `strum` 0.26.* to 0.27. strum = { path = "build/rust/strum" } +# Patch `itertools` 0.10.* to 0.14. +itertools = { path = "build/rust/itertools" } + # Overrides to allow easier use of common internal crates. moz_asserts = { path = "mozglue/static/rust/moz_asserts" } @@ -260,14 +263,14 @@ malloc_size_of_derive = { path = "xpcom/rust/malloc_size_of_derive" } objc = { git = "https://github.com/glandium/rust-objc", rev = "4de89f5aa9851ceca4d40e7ac1e2759410c04324" } # application-services overrides to make updating them all simpler. -interrupt-support = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -relevancy = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -search = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -sql-support = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -suggest = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -sync15 = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -tabs = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -viaduct = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -webext-storage = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } +interrupt-support = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +relevancy = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +search = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +sql-support = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +suggest = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +sync15 = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +tabs = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +viaduct = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +webext-storage = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } allocator-api2 = { path = "third_party/rust/allocator-api2" } diff --git a/accessible/interfaces/msaa/moz.build b/accessible/interfaces/msaa/moz.build index 7a1053317a3..e06651313ed 100644 --- a/accessible/interfaces/msaa/moz.build +++ b/accessible/interfaces/msaa/moz.build @@ -4,7 +4,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -GeckoSharedLibrary("AccessibleMarshal", linkage=None) +GeckoSharedLibrary("AccessibleMarshal") # Missing here, is the notion that changes to the idl files included by # ISimpleDOM.idl (e.g. ISimpleDOMNode.idl) should rebuild the outputs. diff --git a/accessible/mac/AccessibleWrap.mm b/accessible/mac/AccessibleWrap.mm index 801d41845de..44a6a9f83bc 100644 --- a/accessible/mac/AccessibleWrap.mm +++ b/accessible/mac/AccessibleWrap.mm @@ -307,6 +307,9 @@ Class a11y::GetTypeFromRole(roles::Role aRole) { case roles::OUTLINEITEM: return [mozOutlineRowAccessible class]; + case roles::LABEL: + return [MOXLabelAccessible class]; + default: return [mozAccessible class]; } diff --git a/accessible/mac/mozAccessible.mm b/accessible/mac/mozAccessible.mm index bc4c329772b..95582b56746 100644 --- a/accessible/mac/mozAccessible.mm +++ b/accessible/mac/mozAccessible.mm @@ -887,22 +887,19 @@ struct RoleDescrComparator { : nullptr; if (maybeRoot && maybeRoot->IsRoot() && [[self moxDOMIdentifier] isEqualToString:@"a11y-announcement"]) { - // Our actual announcement should be stored as a child of the alert, - // so we verify a child exists, and then query that child below. - NSArray* children = [self moxChildren]; - MOZ_ASSERT([children count] == 1 && children[0], - "A11yUtil event received, but no announcement found?"); - - mozAccessible* announcement = children[0]; - NSString* key; - if ([announcement providesLabelNotTitle]) { - key = [announcement moxLabel]; + nsAutoString name; + // Our actual announcement should be stored as a child of the alert. + if (Accessible* announcement = mGeckoAccessible->FirstChild()) { + announcement->Name(name); } else { - key = [announcement moxTitle]; + MOZ_ASSERT_UNREACHABLE( + "A11yUtil event received, but no announcement found?"); } NSDictionary* info = @{ - NSAccessibilityAnnouncementKey : key ? key : @(""), + NSAccessibilityAnnouncementKey : name.IsEmpty() + ? @("") + : nsCocoaUtils::ToNSString(name), // High priority means VO will stop what it is currently speaking // to speak our announcement. NSAccessibilityPriorityKey : @(NSAccessibilityPriorityHigh) diff --git a/accessible/mac/mozHTMLAccessible.h b/accessible/mac/mozHTMLAccessible.h index 48fd4b0bdc4..02a55960dfb 100644 --- a/accessible/mac/mozHTMLAccessible.h +++ b/accessible/mac/mozHTMLAccessible.h @@ -42,3 +42,10 @@ - (NSString*)moxTitle; @end + +@interface MOXLabelAccessible : mozAccessible + +// override +- (NSString*)moxTitle; + +@end diff --git a/accessible/mac/mozHTMLAccessible.mm b/accessible/mac/mozHTMLAccessible.mm index 09680033419..feb2c5d6602 100644 --- a/accessible/mac/mozHTMLAccessible.mm +++ b/accessible/mac/mozHTMLAccessible.mm @@ -81,3 +81,11 @@ using namespace mozilla::a11y; } @end + +@implementation MOXLabelAccessible + +- (NSString*)moxTitle { + return @""; +} + +@end diff --git a/accessible/tests/browser/mac/browser.toml b/accessible/tests/browser/mac/browser.toml index ea670e1cc04..0ee0d980c6d 100644 --- a/accessible/tests/browser/mac/browser.toml +++ b/accessible/tests/browser/mac/browser.toml @@ -23,6 +23,7 @@ https_first_disabled = true ["browser_aria_controls_flowto.js"] ["browser_aria_current.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1802555 ["browser_aria_expanded.js"] diff --git a/accessible/tests/browser/mac/browser_label_title.js b/accessible/tests/browser/mac/browser_label_title.js index f5bdd393346..233b0befcf6 100644 --- a/accessible/tests/browser/mac/browser_label_title.js +++ b/accessible/tests/browser/mac/browser_label_title.js @@ -22,8 +22,8 @@ addAccessibleTask( let n1 = getNativeInterface(accDoc, "n1"); let n1Label = n1.getAttributeValue("AXTitleUIElement"); // XXX: In Safari the label is an AXText with an AXValue, - // here it is an AXGroup witth an AXTitle - is(n1Label.getAttributeValue("AXTitle"), "Label"); + // we emulate that so VoiceOver does not speak the label twice. + is(n1Label.getAttributeValue("AXTitle"), ""); let n2 = getNativeInterface(accDoc, "n2"); is(n2.getAttributeValue("AXDescription"), "Two Labels"); diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000000..e365a9a22b9 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,14 @@ +dnl +dnl Local autoconf macros used with mozilla +dnl The contents of this file are under the Public Domain. +dnl + +builtin(include, build/autoconf/hooks.m4)dnl +builtin(include, build/autoconf/config.status.m4)dnl +builtin(include, build/autoconf/altoptions.m4)dnl + +# Read the user's .mozconfig script. We can't do this in +# configure.in: autoconf puts the argument parsing code above anything +# expanded from configure.in, and we need to get the configure options +# from .mozconfig in place before that argument parsing code. +MOZ_READ_MOZCONFIG(.) diff --git a/browser/actors/AboutReaderParent.sys.mjs b/browser/actors/AboutReaderParent.sys.mjs index 16801ea514f..60ab6a19175 100644 --- a/browser/actors/AboutReaderParent.sys.mjs +++ b/browser/actors/AboutReaderParent.sys.mjs @@ -101,25 +101,13 @@ export class AboutReaderParent extends JSWindowActorParent { let preferredWidth = message.data.preferredWidth || 0; let uri = Services.io.newURI(message.data.url); - let result = await new Promise(resolve => { - lazy.PlacesUtils.favicons.getFaviconURLForPage( - uri, - iconUri => { - if (iconUri) { - resolve({ - url: message.data.url, - faviconUrl: iconUri.spec, - }); - } else { - resolve(null); - } - }, - preferredWidth - ); - }); + let result = await lazy.PlacesUtils.favicons.getFaviconForPage( + uri, + preferredWidth + ); this.callListeners(message); - return result; + return result && { url: uri.spec, faviconUrl: result.uri.spec }; } catch (ex) { console.error( "Error requesting favicon URL for about:reader content: ", diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 53753b23fe0..96cef75b077 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -908,9 +908,6 @@ pref("browser.spin_cursor_while_busy", false); // Enable display of contextual-password-manager option in browser sidebar pref("browser.contextual-password-manager.enabled", false); -// Add the "Passwords" tool to the sidebar if contextual-password-manager is enabled. -pref("sidebar.newTool.migration.passwords", '{ "visibilityPref": "browser.contextual-password-manager.enabled"}'); - // Enables the display of the Mozilla VPN banner in private browsing windows pref("browser.privatebrowsing.vpnpromourl", "https://vpn.mozilla.org/?utm_source=firefox-browser&utm_medium=firefox-%CHANNEL%-browser&utm_campaign=private-browsing-vpn-link"); diff --git a/browser/base/content/metrics.yaml b/browser/base/content/metrics.yaml index 90e5fb5adef..00ce7e426ac 100644 --- a/browser/base/content/metrics.yaml +++ b/browser/base/content/metrics.yaml @@ -10,94 +10,6 @@ $schema: moz://mozilla.org/schemas/glean/metrics/2-0-0 $tags: - 'Firefox :: General' -privacy.sanitize: - dialog_open: - type: event - description: > - Dispatched when one of the sanitize dialogs opens - bugs: - - https://bugzilla.mozilla.org/1856417 - - https://bugzilla.mozilla.org/1922608 - data_reviews: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1856417#c4 - notification_emails: - - wwen@mozilla.com - - emz@mozilla.com - expires: 140 - extra_keys: - context: - description: > - string representing which context the dialog was opened in, - one of ["browser", "clearSiteData", "clearHistory"] - type: string - clear: - type: event - description: > - Dispatched when the dialog is accepted (to clear) - bugs: - - https://bugzilla.mozilla.org/1856417 - - https://bugzilla.mozilla.org/1922608 - data_reviews: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1856417#c4 - notification_emails: - - wwen@mozilla.com - - emz@mozilla.com - expires: 140 - extra_keys: - context: - description: > - string representing which context the dialog was opened in, - one of ["browser", "clearSiteData", "clearHistory"] - type: string - history_and_downloads: - description: true if browsing history and downloads is selected to be cleared - type: boolean - cookies_and_storage: - description: true if cookies and storage is selected to be cleared - type: boolean - cache: - description: true if cache is selected to be cleared - type: boolean - site_settings: - description: true if site settings is selected to be cleared - type: boolean - form_data: - description: true if form data is selected to be cleared - type: boolean - clearing_time_span_selected: - type: event - description: > - The time span range selected to sanitize - bugs: - - https://bugzilla.mozilla.org/1856417 - - https://bugzilla.mozilla.org/1922608 - data_reviews: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1856417#c4 - notification_emails: - - wwen@mozilla.com - - emz@mozilla.com - expires: 140 - extra_keys: - time_span: - description: The timespan that was selected corresponding to one of Sanitizer.TIMESPAN_*'s value - - type: string - load_time: - type: timing_distribution - time_unit: millisecond - description: > - How much time was spent to open the dialog, including loading data sizes - bugs: - - https://bugzilla.mozilla.org/1856417 - - https://bugzilla.mozilla.org/1922608 - data_reviews: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1856417#c4 - notification_emails: - - wwen@mozilla.com - - emz@mozilla.com - expires: - 140 - security.ui.protectionspopup: open_protections_popup: type: event diff --git a/browser/base/content/sanitizeDialog.js b/browser/base/content/sanitizeDialog.js index 93a419e0139..661bc9926c3 100644 --- a/browser/base/content/sanitizeDialog.js +++ b/browser/base/content/sanitizeDialog.js @@ -111,18 +111,8 @@ var gSanitizePromptDialog = { } if (!lazy.USE_OLD_DIALOG) { - // Begin collecting how long it takes to load from here - let timerId = Glean.privacySanitize.loadTime.start(); this._dataSizesUpdated = false; - this.dataSizesFinishedUpdatingPromise = this.getAndUpdateDataSizes() - .then(() => { - // We're done loading, stop telemetry here - Glean.privacySanitize.loadTime.stopAndAccumulate(timerId); - }) - .catch(() => { - // We're done loading, stop telemetry here - Glean.privacySanitize.loadTime.cancel(timerId); - }); + this.dataSizesFinishedUpdatingPromise = this.getAndUpdateDataSizes(); // this promise is still used in tests } let OKButton = this._dialog.getButton("accept"); @@ -191,10 +181,6 @@ var gSanitizePromptDialog = { if (this._inClearOnShutdownNewDialog) { this.updatePrefs(); } else { - if (!lazy.USE_OLD_DIALOG) { - this.reportTelemetry("clear"); - } - this.sanitize(e); } }); @@ -224,10 +210,6 @@ var gSanitizePromptDialog = { } else { this.warningBox.hidden = true; } - - if (!lazy.USE_OLD_DIALOG) { - this.reportTelemetry("open"); - } }, updateAcceptButtonState() { @@ -558,42 +540,6 @@ var gSanitizePromptDialog = { } return items; }, - - reportTelemetry(event) { - let contextOpenedIn; - if (this._inClearSiteDataNewDialog) { - contextOpenedIn = "clearSiteData"; - } else if (this._inBrowserWindow) { - contextOpenedIn = "browser"; - } else { - contextOpenedIn = "clearHistory"; - } - - // Report time span and clearing options after sanitize is clicked - if (event == "clear") { - Glean.privacySanitize.clearingTimeSpanSelected.record({ - time_span: this.selectedTimespan.toString(), - }); - - let selectedOptions = this.getItemsToClear(); - Glean.privacySanitize.clear.record({ - context: contextOpenedIn, - history_and_downloads: selectedOptions.includes( - "browsingHistoryAndDownloads" - ), - cookies_and_storage: selectedOptions.includes("cookiesAndStorage"), - cache: selectedOptions.includes("cache"), - site_settings: selectedOptions.includes("siteSettings"), - form_data: selectedOptions.includes("formdata"), - }); - } - // if the dialog was just opened, just report which context it was opened in - else { - Glean.privacySanitize.dialogOpen.record({ - context: contextOpenedIn, - }); - } - }, }; // We need to give the dialog an opportunity to set up the DOM diff --git a/browser/base/content/test/favicons/browser_favicon_nostore.js b/browser/base/content/test/favicons/browser_favicon_nostore.js index 24a54461c47..a26170ff2e8 100644 --- a/browser/base/content/test/favicons/browser_favicon_nostore.js +++ b/browser/base/content/test/favicons/browser_favicon_nostore.js @@ -31,17 +31,10 @@ add_task(async function browser_loader() { // Ensure the favicon has not been stored. /* eslint-disable mozilla/no-arbitrary-setTimeout */ await new Promise(resolve => setTimeout(resolve, 1000)); - await new Promise((resolve, reject) => { - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI(PAGE_URL), - foundIconURI => { - if (foundIconURI) { - reject(new Error("An icon has been stored " + foundIconURI.spec)); - } - resolve(); - } - ); - }); + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(PAGE_URL) + ); + Assert.ok(!favicon); BrowserTestUtils.removeTab(tab); }); @@ -68,17 +61,10 @@ async function later_addition(iconUrl) { // Ensure the favicon has not been stored. /* eslint-disable mozilla/no-arbitrary-setTimeout */ await new Promise(resolve => setTimeout(resolve, 1000)); - await new Promise((resolve, reject) => { - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI(PAGE_URL), - foundIconURI => { - if (foundIconURI) { - reject(new Error("An icon has been stored " + foundIconURI.spec)); - } - resolve(); - } - ); - }); + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(PAGE_URL) + ); + Assert.ok(!favicon); BrowserTestUtils.removeTab(tab); } @@ -127,13 +113,10 @@ add_task(async function root_icon_stored() { }, async function () { await TestUtils.waitForCondition(async () => { - let uri = await new Promise(resolve => - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI("http://www.nostore.com/page"), - resolve - ) + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI("http://www.nostore.com/page") ); - return uri?.spec == "http://www.nostore.com/favicon.ico"; + return favicon?.uri.spec == "http://www.nostore.com/favicon.ico"; }, "wait for the favicon to be stored"); Assert.ok(await noStorePromise, "Should have received no-store header"); } @@ -174,13 +157,10 @@ add_task(async function root_icon_after_pageshow_stored() { }, async function () { await TestUtils.waitForCondition(async () => { - let uri = await new Promise(resolve => - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI("http://rootafterpageshow.com/page"), - resolve - ) + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI("http://rootafterpageshow.com/page") ); - return uri?.spec == "http://rootafterpageshow.com/favicon.ico"; + return favicon?.uri.spec == "http://rootafterpageshow.com/favicon.ico"; }, "wait for the favicon to be stored"); } ); diff --git a/browser/base/content/test/favicons/browser_favicon_store.js b/browser/base/content/test/favicons/browser_favicon_store.js index a183effe1af..43500e0a69d 100644 --- a/browser/base/content/test/favicons/browser_favicon_store.js +++ b/browser/base/content/test/favicons/browser_favicon_store.js @@ -21,22 +21,14 @@ async function test_icon(pageUrl, iconUrl) { // Ensure the favicon has been stored. await storedIconPromise; - await new Promise((resolve, reject) => { - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI(pageUrl), - foundIconURI => { - if (foundIconURI) { - Assert.equal( - foundIconURI.spec, - iconUrl, - "Should have stored the expected icon." - ); - resolve(); - } - reject(); - } - ); - }); + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(pageUrl) + ); + Assert.equal( + favicon.uri.spec, + iconUrl, + "Should have stored the expected icon." + ); }); } diff --git a/browser/base/content/test/performance/browser.toml b/browser/base/content/test/performance/browser.toml index c1db25d758b..d6d7e0cdd19 100644 --- a/browser/base/content/test/performance/browser.toml +++ b/browser/base/content/test/performance/browser.toml @@ -67,6 +67,9 @@ run-if = [ "debug", "nightly_build", # Requires StartupRecorder.sys.mjs, which isn't shipped everywhere by default ] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1889278 +] ["browser_tabclose.js"] skip-if = [ diff --git a/browser/base/content/test/sanitize/browser_sanitizeDialog_v2.js b/browser/base/content/test/sanitize/browser_sanitizeDialog_v2.js index 833a74294a1..7d0c8fde432 100644 --- a/browser/base/content/test/sanitize/browser_sanitizeDialog_v2.js +++ b/browser/base/content/test/sanitize/browser_sanitizeDialog_v2.js @@ -767,134 +767,6 @@ add_task(async function test_clear_on_shutdown() { await SiteDataTestUtils.clear(); }); -add_task(async function testEntryPointTelemetry() { - Services.fog.testResetFOG(); - - // Telemetry count we expect for each context - const EXPECTED_CONTEXT_COUNTS = { - browser: 3, - clearHistory: 2, - clearSiteData: 1, - }; - - for (let key in EXPECTED_CONTEXT_COUNTS) { - let count = 0; - - for (let i = 0; i < EXPECTED_CONTEXT_COUNTS[key]; i++) { - await performActionsOnDialog({ context: key }); - } - - let contextTelemetry = Glean.privacySanitize.dialogOpen.testGetValue(); - for (let object of contextTelemetry) { - if (object.extra.context == key) { - count += 1; - } - } - - is( - count, - EXPECTED_CONTEXT_COUNTS[key], - `There should be ${EXPECTED_CONTEXT_COUNTS[key]} opens from ${key} context` - ); - } -}); - -add_task(async function testTimespanTelemetry() { - Services.fog.testResetFOG(); - - // Expected timespan selections from telemetry - const EXPECTED_TIMESPANS = [ - Sanitizer.TIMESPAN_HOUR, - Sanitizer.TIMESPAN_2HOURS, - Sanitizer.TIMESPAN_4HOURS, - Sanitizer.TIMESPAN_EVERYTHING, - ]; - - for (let timespan of EXPECTED_TIMESPANS) { - await performActionsOnDialog({ timespan }); - } - - for (let index in EXPECTED_TIMESPANS) { - is( - Glean.privacySanitize.clearingTimeSpanSelected.testGetValue()[index].extra - .time_span, - EXPECTED_TIMESPANS[index].toString(), - `Selected timespan should be ${EXPECTED_TIMESPANS[index]}` - ); - } -}); - -add_task(async function testLoadtimeTelemetry() { - Services.fog.testResetFOG(); - - // loadtime metric is collected everytime that the dialog is opened - // expected number of times dialog will be opened for the test for each context - let EXPECTED_CONTEXT_COUNTS = { - browser: 2, - clearHistory: 3, - clearSiteData: 2, - }; - - // open dialog based on expected_context_counts - for (let context in EXPECTED_CONTEXT_COUNTS) { - for (let i = 0; i < EXPECTED_CONTEXT_COUNTS[context]; i++) { - await performActionsOnDialog({ context }); - } - } - - let loadTimeDistribution = Glean.privacySanitize.loadTime.testGetValue(); - - let expectedNumberOfCounts = Object.entries(EXPECTED_CONTEXT_COUNTS).reduce( - (acc, [, value]) => acc + value, - 0 - ); - // No guarantees from timers means no guarantees on buckets. - // But we can guarantee it's only two samples. - is( - Object.entries(loadTimeDistribution.values).reduce( - (acc, [, count]) => acc + count, - 0 - ), - expectedNumberOfCounts, - `Only ${expectedNumberOfCounts} buckets with samples` - ); -}); - -add_task(async function testClearingOptionsTelemetry() { - Services.fog.testResetFOG(); - - let expectedObject = { - context: "clearSiteData", - history_and_downloads: "true", - cookies_and_storage: "false", - cache: "true", - site_settings: "true", - form_data: "false", - }; - - await performActionsOnDialog({ - context: "clearSiteData", - browsingHistoryAndDownloads: true, - cookiesAndStorage: false, - cache: true, - siteSettings: true, - formData: false, - }); - - let telemetryObject = Glean.privacySanitize.clear.testGetValue(); - Assert.equal( - telemetryObject.length, - 1, - "There should be only 1 telemetry object recorded" - ); - - Assert.deepEqual( - expectedObject, - telemetryObject[0].extra, - `Expected ${telemetryObject} to be the same as ${expectedObject}` - ); -}); - add_task(async function testClearHistoryCheckboxStatesAfterMigration() { await SpecialPowers.pushPrefEnv({ set: [ diff --git a/browser/base/content/test/webrtc/browser.toml b/browser/base/content/test/webrtc/browser.toml index 452651da9a4..06a7fd94df6 100644 --- a/browser/base/content/test/webrtc/browser.toml +++ b/browser/base/content/test/webrtc/browser.toml @@ -18,6 +18,9 @@ prefs = [ ] ["browser_WebrtcGlobalInformation.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1961544 +] ["browser_device_controls_menus.js"] skip-if = [ diff --git a/browser/base/content/test/webrtc/gracePeriod/browser.toml b/browser/base/content/test/webrtc/gracePeriod/browser.toml index 88dd800314c..ff0bd3cb5e8 100644 --- a/browser/base/content/test/webrtc/gracePeriod/browser.toml +++ b/browser/base/content/test/webrtc/gracePeriod/browser.toml @@ -13,3 +13,4 @@ prefs = [ ] ["../browser_devices_get_user_media_grace.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # Bug 1961543 diff --git a/browser/base/content/webext-panels.xhtml b/browser/base/content/webext-panels.xhtml index fcbfc198d54..ca0cf1b1130 100644 --- a/browser/base/content/webext-panels.xhtml +++ b/browser/base/content/webext-panels.xhtml @@ -5,7 +5,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. - + { + e.preventDefault(); + lazy.SpecialMessageActions.handleAction( + { type: "OPEN_URL", data: { args: a.href, where: part.where } }, + browser + ); + }); - return docFragment; + if (part.string_id) { + const l10n = lazy.RemoteL10n.createElement(doc, "span", { + content: { + string_id: part.string_id, + ...(part.args && { args: part.args }), + }, + }); + a.appendChild(l10n); + } else { + a.textContent = part.raw || ""; + } + node = a; + } else if (part.string_id) { + node = lazy.RemoteL10n.createElement(doc, "span", { + content: { + string_id: part.string_id, + ...(part.args && { args: part.args }), + }, + }); + } else { + const text = part.raw !== null ? part.raw : String(part); + node = doc.createTextNode(text); + } + + frag.appendChild(node); + } + + return frag; } formatButtonConfig(button) { diff --git a/browser/components/asrouter/tests/browser/browser.toml b/browser/components/asrouter/tests/browser/browser.toml index 7ff3638523e..48267bd2989 100644 --- a/browser/components/asrouter/tests/browser/browser.toml +++ b/browser/components/asrouter/tests/browser/browser.toml @@ -48,6 +48,9 @@ skip-if = ["a11y_checks"] # Bug 1854515 and 1858041 to investigate intermittent ["browser_bookmarks_bar_button.js"] ["browser_feature_callout.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1796720 +] ["browser_feature_callout_in_chrome.js"] skip-if = [ diff --git a/browser/components/asrouter/tests/browser/browser_asrouter_experimentsAPILoader.js b/browser/components/asrouter/tests/browser/browser_asrouter_experimentsAPILoader.js index 374b21c2d80..07e6abad196 100644 --- a/browser/components/asrouter/tests/browser/browser_asrouter_experimentsAPILoader.js +++ b/browser/components/asrouter/tests/browser/browser_asrouter_experimentsAPILoader.js @@ -201,7 +201,7 @@ add_task(async function test_loading_experimentsAPI() { // Fetch the new recipe from RS await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "cfr" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "cfr" }), "ExperimentAPI should return an experiment" ); @@ -219,7 +219,7 @@ add_task(async function test_loading_fxms_message_1_feature() { // Fetch the new recipe from RS await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "fxms-message-1" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "fxms-message-1" }), "ExperimentAPI should return an experiment" ); @@ -253,7 +253,7 @@ add_task(async function test_exposure_ping() { // Fetch the new recipe from RS await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "cfr" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "cfr" }), "ExperimentAPI should return an experiment" ); @@ -312,7 +312,7 @@ add_task(async function test_update_on_enrollments_changed() { await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "cfr" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "cfr" }), "ExperimentAPI should return an experiment" ); await enrollmentChanged; @@ -349,7 +349,7 @@ add_task(async function test_emptyMessage() { await setup(experiment); await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "cfr" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "cfr" }), "ExperimentAPI should return an experiment" ); @@ -404,7 +404,7 @@ add_task(async function test_multiMessageTreatment() { await setup(recipe); await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId }), + () => ExperimentAPI.getExperimentMetaData({ featureId }), "ExperimentAPI should return an experiment" ); diff --git a/browser/components/asrouter/tests/browser/browser_asrouter_infobar.js b/browser/components/asrouter/tests/browser/browser_asrouter_infobar.js index 9a8f555ebd8..e337e83f0b8 100644 --- a/browser/components/asrouter/tests/browser/browser_asrouter_infobar.js +++ b/browser/components/asrouter/tests/browser/browser_asrouter_infobar.js @@ -252,3 +252,119 @@ add_task( ); } ); + +function getMeaningfulNodes(infobar) { + return [...infobar.notification.messageText.childNodes].filter( + n => + n.nodeType === Node.ELEMENT_NODE || + (n.nodeType === Node.TEXT_NODE && n.textContent.trim()) + ); +} + +async function showInfobar(text, box, browser) { + let msg = { + id: "Test Infobar", + content: { + text, + type: "global", + priority: box.PRIORITY_INFO_LOW, + buttons: [{ label: "Close", action: { type: "CANCEL" } }], + }, + }; + let stub = sinon.stub(); + let infobar = await InfoBar.showInfoBarMessage(browser, msg, stub); + return { infobar, stub }; +} + +add_task(async function test_formatMessageConfig_single_string() { + const win = BrowserWindowTracker.getTopWindow(); + const browser = win.gBrowser.selectedBrowser; + const box = win.gNotificationBox; + + let { infobar } = await showInfobar("Just a plain string", box, browser); + const nodes = getMeaningfulNodes(infobar); + + Assert.equal(nodes.length, 1, "One meaningful node for single string"); + Assert.equal(nodes[0].nodeType, Node.TEXT_NODE, "That node is a text node"); + Assert.equal(nodes[0].textContent.trim(), "Just a plain string"); + + infobar.notification.closeButton.click(); + await BrowserTestUtils.waitForCondition(() => !InfoBar._activeInfobar); +}); + +add_task(async function test_formatMessageConfig_array() { + const win = BrowserWindowTracker.getTopWindow(); + const browser = win.gBrowser.selectedBrowser; + const box = win.gNotificationBox; + + let parts = [ + "A", + { raw: "B" }, + { string_id: "launch-on-login-infobar-message" }, + { href: "https://x.test/", raw: "LINK" }, + "Z", + ]; + let { infobar } = await showInfobar(parts, box, browser); + const nodes = getMeaningfulNodes(infobar); + + Assert.equal(nodes.length, parts.length, "One node per array part"); + Assert.equal(nodes[0].textContent, "A", "Plain text"); + Assert.equal(nodes[1].textContent, "B", "Raw text"); + Assert.equal(nodes[2].localName, "remote-text", "L10n element"); + Assert.equal( + nodes[2].getAttribute("fluent-remote-id"), + "launch-on-login-infobar-message", + "Fluent ID" + ); + const [, , , a] = nodes; + Assert.equal(a.localName, "a", "It's a link"); + Assert.equal(a.getAttribute("href"), "https://x.test/", "hred preserved"); + Assert.equal(a.textContent, "LINK", "Link text"); + Assert.equal(nodes[4].textContent, "Z", "Trailing text"); + + infobar.notification.closeButton.click(); + await BrowserTestUtils.waitForCondition(() => !InfoBar._activeInfobar); +}); + +add_task(async function test_specialMessageAction_onLinkClick() { + const win = BrowserWindowTracker.getTopWindow(); + const browser = win.gBrowser.selectedBrowser; + const box = win.gNotificationBox; + + const { SpecialMessageActions } = ChromeUtils.importESModule( + "resource://messaging-system/lib/SpecialMessageActions.sys.mjs" + ); + let handleStub = sinon.stub(SpecialMessageActions, "handleAction"); + + const parts = [ + "Click ", + { raw: "here", href: "https://example.com/foo", where: "tab" }, + " to continue", + ]; + let { infobar } = await showInfobar(parts, box, browser); + + let link = infobar.notification.messageText.querySelector("a[href]"); + Assert.ok(link, "Found the link"); + EventUtils.synthesizeMouseAtCenter(link, {}, browser.ownerGlobal); + + Assert.equal(handleStub.callCount, 1, "handleAction was invoked once"); + let [actionArg, browserArg] = handleStub.firstCall.args; + Assert.deepEqual( + actionArg, + { + type: "OPEN_URL", + data: { args: "https://example.com/foo", where: "tab" }, + }, + "Passed correct action to handleAction" + ); + Assert.equal( + browserArg, + browser, + "Passed the selectedBrowser to handleAction" + ); + + infobar.notification.closeButton.click(); + await BrowserTestUtils.waitForCondition(() => !InfoBar._activeInfobar); + + handleStub.restore(); +}); diff --git a/browser/components/asrouter/tests/browser/browser_trigger_messagesLoaded.js b/browser/components/asrouter/tests/browser/browser_trigger_messagesLoaded.js index b350bedc913..a2e927a09a1 100644 --- a/browser/components/asrouter/tests/browser/browser_trigger_messagesLoaded.js +++ b/browser/components/asrouter/tests/browser/browser_trigger_messagesLoaded.js @@ -111,7 +111,7 @@ add_task(async function test_messagesLoaded_reach_experiment() { }); await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId }), + () => ExperimentAPI.getExperimentMetaData({ featureId }), "ExperimentAPI should return an experiment" ); diff --git a/browser/components/asrouter/tests/unit/ASRouter.test.js b/browser/components/asrouter/tests/unit/ASRouter.test.js index ce57f07b337..ad4306c9b29 100644 --- a/browser/components/asrouter/tests/unit/ASRouter.test.js +++ b/browser/components/asrouter/tests/unit/ASRouter.test.js @@ -276,15 +276,6 @@ describe("ASRouter", () => { active: true, branch: { slug: "experiment-branch-slug" }, }), - getExperiment: sandbox.stub().returns({ - branch: { - slug: "unit-slug", - feature: { - featureId: "foo", - value: { id: "test-message" }, - }, - }, - }), getAllBranches: sandbox.stub().resolves([]), ready: sandbox.stub().resolves(), }, @@ -2482,8 +2473,6 @@ describe("ASRouter", () => { featureIds: ["infobar"], }; - global.ExperimentAPI.getExperiment.returns(null); - const result = await MessageLoaderUtils.loadMessagesForProvider(args); assert.lengthOf(result.messages, 0); diff --git a/browser/components/asrouter/tests/unit/unit-entry.js b/browser/components/asrouter/tests/unit/unit-entry.js index a68e505ae37..ed845dd4435 100644 --- a/browser/components/asrouter/tests/unit/unit-entry.js +++ b/browser/components/asrouter/tests/unit/unit-entry.js @@ -516,7 +516,6 @@ const TEST_GLOBAL = { }, FX_MONITOR_OAUTH_CLIENT_ID: "fake_client_id", ExperimentAPI: { - getExperiment() {}, getExperimentMetaData() {}, getRolloutMetaData() {}, }, diff --git a/browser/components/attribution/metrics.yaml b/browser/components/attribution/metrics.yaml new file mode 100644 index 00000000000..13eb8d5edc9 --- /dev/null +++ b/browser/components/attribution/metrics.yaml @@ -0,0 +1,102 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Adding a new metric? We have docs for that! +# https://firefox-source-docs.mozilla.org/toolkit/components/glean/user/new_definitions_file.html + +--- +$schema: moz://mozilla.org/schemas/glean/metrics/2-0-0 +$tags: + - 'Toolkit :: Telemetry' + +glean.attribution: + ext: + type: object + lifetime: user + # Permit long description lines + # yamllint disable + description: | + Extended attribution information. + Mapped to client_info.attribution.ext in datasets. + * `experiment`: name/id of the enrolled funnel experiment + * `variation`: name/id of the variation cohort used in the enrolled funnel experiment + * `ua`: identifier derived from the user agent downloading the installer + e.g. chrome, Google Chrome 123 + * `dltoken`: Unique token created at Firefox download time. + e.g. c18f86a3-f228-4d98-91bb-f90135c0aa9c + * `msstoresignedin`: only present if the installation was done through the Microsoft Store, + and was able to retrieve the "campaign ID" it was first installed with. + This value is "true" if the user was signed into the Microsoft Store + when they first installed, and false otherwise. + * `dlsource`: identifier that indicate where installations of Firefox originate + # yamllint enable + bugs: + - https://bugzilla.mozilla.org/1955429 + data_reviews: + - https://bugzilla.mozilla.org/1955429 + notification_emails: + - chutten@mozilla.com + send_in_pings: + - metrics + - baseline + - events + expires: never + no_lint: + - BASELINE_PING + structure: + type: object + properties: + experiment: + type: string + variation: + type: string + ua: + type: string + dltoken: + type: string + msstoresignedin: + type: boolean + dlsource: + type: string + +glean.distribution: + ext: + type: object + lifetime: user + description: | + Extended distribution information. + Mapped to client_info.distribution.ext in datasets. + * `distributionVersion`: pref `distribution.version`, `null` on failure + * `partnerId`: pref `mozilla.partner.id`, `null` on failure + * `distributor`: pref `app.distributor`, `null` on failure + * `distributorChannel`: pref `app.distributor.channel`, `null` on failure + * `partnerNames`: list from prefs `app.partner.=` + bugs: + - https://bugzilla.mozilla.org/1955429 + data_reviews: + - https://bugzilla.mozilla.org/1955429 + notification_emails: + - chutten@mozilla.com + send_in_pings: + - metrics + - baseline + - events + expires: never + no_lint: + - BASELINE_PING + structure: + type: object + properties: + distributionVersion: + type: string + partnerId: + type: string + distributor: + type: string + distributorChannel: + type: string + partnerNames: + type: array + items: + type: string diff --git a/browser/components/contextualidentity/test/browser/browser.toml b/browser/components/contextualidentity/test/browser/browser.toml index e2c85b8378d..280e6a4dcc3 100644 --- a/browser/components/contextualidentity/test/browser/browser.toml +++ b/browser/components/contextualidentity/test/browser/browser.toml @@ -48,6 +48,7 @@ tags = "bleedover" skip-if = [ "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1775706 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1775706 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775706 ] ["browser_originattrs_reopenin.js"] diff --git a/browser/components/customizableui/test/browser.toml b/browser/components/customizableui/test/browser.toml index cd8ad41a75d..3639b5b526a 100644 --- a/browser/components/customizableui/test/browser.toml +++ b/browser/components/customizableui/test/browser.toml @@ -59,6 +59,9 @@ skip-if = ["os == 'linux' && os_version == '18.04' && processor == 'x86_64' && r ["browser_877447_skip_missing_ids.js"] ["browser_878452_drag_to_panel.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1961559 +] ["browser_884402_customize_from_overflow.js"] tags = "overflowable-toolbar" @@ -92,6 +95,7 @@ skip-if = ["os == 'linux'"] ["browser_918049_skipintoolbarset_dnd.js"] ["browser_923857_customize_mode_event_wrapping_during_reset.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt && socketprocess_networking"] # Bug 1961545 ["browser_927717_customize_drag_empty_toolbar.js"] @@ -160,6 +164,7 @@ tags = "overflowable-toolbar" ["browser_963639_customizing_attribute_non_customizable_toolbar.js"] ["browser_968565_insert_before_hidden_items.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1961547 ["browser_969427_recreate_destroyed_widget_after_reset.js"] @@ -373,5 +378,9 @@ skip-if = [ ["browser_vertical_tabs_customize_navbar.js"] ["browser_widget_animation.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1961548 ["browser_widget_recreate_events.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1961546 +] diff --git a/browser/components/enterprisepolicies/Policies.sys.mjs b/browser/components/enterprisepolicies/Policies.sys.mjs index 32b2f62180e..c3b2827ad09 100644 --- a/browser/components/enterprisepolicies/Policies.sys.mjs +++ b/browser/components/enterprisepolicies/Policies.sys.mjs @@ -2566,6 +2566,21 @@ export var Policies = { }, }, + SkipTermsOfUse: { + onBeforeAddons(manager, param) { + if (param) { + setAndLockPref( + "datareporting.policy.dataSubmissionPolicyAcceptedVersion", + 999 + ); + setAndLockPref( + "datareporting.policy.dataSubmissionPolicyNotifiedTime", + Date.now().toString() + ); + } + }, + }, + SSLVersionMax: { onBeforeAddons(manager, param) { let tlsVersion; @@ -2670,18 +2685,6 @@ export var Policies = { param.Locked ); } - if (param.SkipTermsOfUse) { - PoliciesUtils.setDefaultPref( - "datareporting.policy.dataSubmissionPolicyAcceptedVersion", - 999, - param.Locked - ); - PoliciesUtils.setDefaultPref( - "datareporting.policy.dataSubmissionPolicyNotifiedTime", - Date.now().toString(), - param.Locked - ); - } if ("MoreFromMozilla" in param) { PoliciesUtils.setDefaultPref( "browser.preferences.moreFromMozilla", diff --git a/browser/components/enterprisepolicies/schemas/policies-schema.json b/browser/components/enterprisepolicies/schemas/policies-schema.json index d01451d78b6..1de3e655d25 100644 --- a/browser/components/enterprisepolicies/schemas/policies-schema.json +++ b/browser/components/enterprisepolicies/schemas/policies-schema.json @@ -1498,6 +1498,10 @@ "type": "boolean" }, + "SkipTermsOfUse": { + "type": "boolean" + }, + "SSLVersionMax": { "type": "string", "enum": ["tls1", "tls1.1", "tls1.2", "tls1.3"] @@ -1550,9 +1554,6 @@ "SkipOnboarding": { "type": "boolean" }, - "SkipTermsOfUse": { - "type": "boolean" - }, "MoreFromMozilla": { "type": "boolean" }, diff --git a/browser/components/enterprisepolicies/tests/browser/browser_policy_bookmarks.js b/browser/components/enterprisepolicies/tests/browser/browser_policy_bookmarks.js index ddb7114adff..c109a130f28 100644 --- a/browser/components/enterprisepolicies/tests/browser/browser_policy_bookmarks.js +++ b/browser/components/enterprisepolicies/tests/browser/browser_policy_bookmarks.js @@ -220,12 +220,9 @@ add_task(async function test_initial_bookmarks() { add_task(async function checkFavicon() { let bookmark1url = CURRENT_POLICY.policies.Bookmarks[0].URL; - let result = await new Promise(resolve => { - PlacesUtils.favicons.getFaviconDataForPage( - Services.io.newURI(bookmark1url), - (uri, _, data) => resolve({ uri, data }) - ); - }); + let result = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(bookmark1url) + ); is( result.uri.spec, @@ -235,7 +232,7 @@ add_task(async function checkFavicon() { // data is an array of octets, which will be a bit hard to compare against // FAVICON_DATA, which is base64 encoded. Checking the expected length should // be good indication that this is working properly. - is(result.data.length, 464, "Favicon data has the correct length"); + is(result.rawData.length, 464, "Favicon data has the correct length"); let faviconsExpiredNotification = TestUtils.topicObserved( "places-favicons-expired" @@ -247,15 +244,11 @@ add_task(async function checkFavicon() { add_task(async function checkNetworkFavicon() { let bookmarkURL = CURRENT_POLICY.policies.Bookmarks[1].URL; - let result = await new Promise(resolve => { - PlacesUtils.favicons.getFaviconDataForPage( - Services.io.newURI(bookmarkURL), - (uri, _, data) => resolve({ uri, data }) - ); - }); + let result = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(bookmarkURL) + ); - is(result.uri, null, "Favicon should not be loaded"); - is(result.data.length, 0, "Favicon data should be empty"); + is(result, null, "Favicon should not be loaded"); }); add_task(async function test_remove_Bookmark_2() { diff --git a/browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js b/browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js index 480d3b47404..42af361b329 100644 --- a/browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js +++ b/browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js @@ -29,9 +29,7 @@ add_task(async function test_skip_terms_of_use_timestamp_set() { const startTime = Date.now(); await setupPolicyEngineWithJson({ policies: { - UserMessaging: { - SkipTermsOfUse: true, - }, + SkipTermsOfUse: true, }, }); const endTime = Date.now(); diff --git a/browser/components/enterprisepolicies/tests/xpcshell/test_simple_pref_policies.js b/browser/components/enterprisepolicies/tests/xpcshell/test_simple_pref_policies.js index 280207d7407..afdf3a89705 100644 --- a/browser/components/enterprisepolicies/tests/xpcshell/test_simple_pref_policies.js +++ b/browser/components/enterprisepolicies/tests/xpcshell/test_simple_pref_policies.js @@ -691,34 +691,6 @@ const POLICIES_TESTS = [ }, }, - { - policies: { - UserMessaging: { - SkipTermsOfUse: false, - Locked: false, - }, - }, - unlockedPrefs: { - "datareporting.policy.dataSubmissionPolicyAcceptedVersion": 0, - "datareporting.policy.dataSubmissionPolicyNotifiedTime": "0", - }, - }, - - { - policies: { - UserMessaging: { - SkipTermsOfUse: true, - Locked: true, - }, - }, - lockedPrefs: { - "datareporting.policy.dataSubmissionPolicyAcceptedVersion": 999, - // "datareporting.policy.dataSubmissionPolicyNotifiedTime" is a string of - // the timestamp at which the policy was set, this is tested in - // browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js - }, - }, - { policies: { UserMessaging: { @@ -1199,6 +1171,19 @@ const POLICIES_TESTS = [ "dom.security.https_only_mode": true, }, }, + + // POLICY: SkipTermsOfUse + { + policies: { + SkipTermsOfUse: true, + }, + lockedPrefs: { + "datareporting.policy.dataSubmissionPolicyAcceptedVersion": 999, + // "datareporting.policy.dataSubmissionPolicyNotifiedTime" is a string of + // the timestamp at which the policy was set, this is tested in + // browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js + }, + }, ]; add_task(async function test_policy_simple_prefs() { diff --git a/browser/components/extensions/test/browser/browser.toml b/browser/components/extensions/test/browser/browser.toml index 3ad746835d0..a36f38c8f7f 100644 --- a/browser/components/extensions/test/browser/browser.toml +++ b/browser/components/extensions/test/browser/browser.toml @@ -114,6 +114,7 @@ https_first_disabled = true ["browser_ext_browsingData_history.js"] ["browser_ext_canOpenModalPicker.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1949651 ["browser_ext_chrome_settings_overrides_home.js"] @@ -279,6 +280,7 @@ https_first_disabled = true ["browser_ext_menus_refresh.js"] ["browser_ext_menus_replace_menu.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1775561 ["browser_ext_menus_replace_menu_context.js"] https_first_disabled = true @@ -319,6 +321,7 @@ skip-if = [ "os == 'linux' && os_version == '18.04' && !debug && verify", "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && !debug && verify", "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && !debug && verify", + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775565 ] ["browser_ext_optionsPage_activity.js"] @@ -335,6 +338,7 @@ skip-if = [ https_first_disabled = true ["browser_ext_originControls.js"] +# skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug TBD ["browser_ext_originControls_internals.js"] diff --git a/browser/components/genai/LinkPreview.sys.mjs b/browser/components/genai/LinkPreview.sys.mjs index 722af5f2e39..aa657794e46 100644 --- a/browser/components/genai/LinkPreview.sys.mjs +++ b/browser/components/genai/LinkPreview.sys.mjs @@ -209,9 +209,11 @@ export const LinkPreview = { // language or restricted. if ( pageData.article.textContent && - pageData.article.language && + pageData.article.detectedLanguage && (!lazy.allowedLanguages || - lazy.allowedLanguages.split(",").includes(pageData.article.language)) + lazy.allowedLanguages + .split(",") + .includes(pageData.article.detectedLanguage)) ) { this.generateKeyPoints(ogCard); } diff --git a/browser/components/genai/LinkPreviewChild.sys.mjs b/browser/components/genai/LinkPreviewChild.sys.mjs index b1ac6ef59c5..1e0b840c69b 100644 --- a/browser/components/genai/LinkPreviewChild.sys.mjs +++ b/browser/components/genai/LinkPreviewChild.sys.mjs @@ -283,7 +283,7 @@ export class LinkPreviewChild extends JSWindowActorChild { title, byline, content, - language, + detectedLanguage, length, siteName, excerpt, @@ -307,7 +307,7 @@ export class LinkPreviewChild extends JSWindowActorChild { title, byline, textContent, - language, + detectedLanguage, length, siteName, excerpt, diff --git a/browser/components/genai/content/link-preview-card.css b/browser/components/genai/content/link-preview-card.css index 129d80f9bd8..d2056972306 100644 --- a/browser/components/genai/content/link-preview-card.css +++ b/browser/components/genai/content/link-preview-card.css @@ -51,12 +51,25 @@ .ai-content { padding: var(--og-padding); - > h3 { + h3 { + align-items: center; + display: flex; font-size: var(--og-main-font-size); font-weight: var(--font-weight-bold); + gap: var(--space-xs); margin: 0; } + img.icon { + -moz-context-properties: fill; + fill: currentColor; + height: var(--icon-size-default); + margin-inline-start: var(--space-xlarge); + pointer-events: none; + width: var(--icon-size-default); + } + + > ul { font-size: var(--og-main-font-size); line-height: 1.15; /* Design requires 18px line-height */ @@ -72,8 +85,25 @@ } } + .visit-link-container { + align-items: center; + display: flex; + justify-content: flex-end; + margin-top: var(--space-xlarge); + + .visit-link { + align-items: center; + display: flex; + gap: var(--space-xs); + font-size: var(--og-main-font-size); + font-weight: var(--font-weight-bold); + } + } + > hr { border-color: var(--border-color-card); + margin-top: var(--space-xlarge); + margin-bottom: var(--space-xlarge); } > p { diff --git a/browser/components/genai/content/link-preview-card.mjs b/browser/components/genai/content/link-preview-card.mjs index 3dab540d53f..0feda7bc0a6 100644 --- a/browser/components/genai/content/link-preview-card.mjs +++ b/browser/components/genai/content/link-preview-card.mjs @@ -55,7 +55,9 @@ class LinkPreviewCard extends MozLitElement { handleLink(event) { event.preventDefault(); - const url = event.target.href; + const anchor = event.target.closest("a"); + const url = anchor.href; + const win = this.ownerGlobal; const params = { triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal( @@ -98,7 +100,8 @@ class LinkPreviewCard extends MozLitElement { render() { const articleData = this.pageData?.article || {}; const pageUrl = this.pageData?.url || "about:blank"; - const siteName = articleData.siteName || ""; + const siteName = + articleData.siteName || this.pageData?.urlComponents?.domain || ""; const { title, description, imageUrl } = this.pageData.meta; @@ -163,7 +166,15 @@ class LinkPreviewCard extends MozLitElement { ${this.generating || this.keyPoints.length ? html`
-

Key points

+

+ Key points + +

    ${ /* All populated content items */ @@ -193,6 +204,22 @@ class LinkPreviewCard extends MozLitElement { : [] }
+ ${this.progress >= 0 ? html`

@@ -212,15 +239,6 @@ class LinkPreviewCard extends MozLitElement { Share feedback

-

- - Visit original page - -

` : ""} diff --git a/browser/components/migration/tests/unit/head_migration.js b/browser/components/migration/tests/unit/head_migration.js index 9b056e66701..dbe62ee6405 100644 --- a/browser/components/migration/tests/unit/head_migration.js +++ b/browser/components/migration/tests/unit/head_migration.js @@ -88,22 +88,6 @@ async function promiseMigration( return Promise.all(promises); } -/** - * Function that returns a favicon url for a given page url - * - * @param {string} uri - * The Bookmark URI - * @returns {string} faviconURI - * The Favicon URI - */ -async function getFaviconForPageURI(uri) { - let faviconURI = await new Promise(resolve => { - PlacesUtils.favicons.getFaviconDataForPage(uri, favURI => { - resolve(favURI); - }); - }); - return faviconURI; -} /** * Takes an array of page URIs and checks that the favicon was imported for each page URI @@ -112,8 +96,8 @@ async function getFaviconForPageURI(uri) { */ async function assertFavicons(pageURIs) { for (let uri of pageURIs) { - let faviconURI = await getFaviconForPageURI(uri); - Assert.ok(faviconURI, `Got favicon for ${uri.spec}`); + let favicon = await PlacesUtils.favicons.getFaviconForPage(uri); + Assert.ok(favicon, `Got favicon for ${favicon.uri.spec}`); } } @@ -128,17 +112,12 @@ async function assertFavicons(pageURIs) { * Expected mime type of the favicon. */ async function assertFavicon(pageURI, expectedImageData, expectedMimeType) { - let result = await new Promise(resolve => { - PlacesUtils.favicons.getFaviconDataForPage( - Services.io.newURI(pageURI), - (faviconURI, dataLen, imageData, mimeType) => { - resolve({ faviconURI, dataLen, imageData, mimeType }); - } - ); - }); + let result = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(pageURI) + ); Assert.ok(!!result, `Got favicon for ${pageURI}`); Assert.equal( - result.imageData.join(","), + result.rawData.join(","), expectedImageData.join(","), "Image data is correct" ); diff --git a/browser/components/moz.build b/browser/components/moz.build index daac97c74ed..890a4b50e28 100644 --- a/browser/components/moz.build +++ b/browser/components/moz.build @@ -36,7 +36,6 @@ DIRS += [ "contentanalysis", "contextualidentity", "customizableui", - "doh", "downloads", "enterprisepolicies", "extensions", diff --git a/browser/components/places/tests/browser/browser.toml b/browser/components/places/tests/browser/browser.toml index 1592c4a6e42..0c35d32f597 100644 --- a/browser/components/places/tests/browser/browser.toml +++ b/browser/components/places/tests/browser/browser.toml @@ -89,6 +89,7 @@ support-files = ["bookmarklet_windowOpen_dummy.html"] ["browser_bookmarksProperties.js"] ["browser_bookmarks_change_title.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1961550 ["browser_bookmarks_change_url.js"] diff --git a/browser/components/places/tests/unit/test_browserGlue_distribution.js b/browser/components/places/tests/unit/test_browserGlue_distribution.js index 8beb942c26f..0ee2e4579d9 100644 --- a/browser/components/places/tests/unit/test_browserGlue_distribution.js +++ b/browser/components/places/tests/unit/test_browserGlue_distribution.js @@ -89,17 +89,8 @@ add_task(async function () { Assert.equal(menuItem.title, "Menu Link After"); // Check no favicon exists for this bookmark - await Assert.rejects( - waitForResolvedPromise( - () => { - return PlacesUtils.promiseFaviconData(menuItem.url.href); - }, - "Favicon not found", - 10 - ), - /Favicon\snot\sfound/, - "Favicon not found" - ); + let favicon = await PlacesUtils.favicons.getFaviconForPage(menuItem.url.URI); + Assert.equal(favicon, null, "Favicon should not be found"); // Check the custom bookmarks exist on toolbar. let toolbarItem = await PlacesUtils.bookmarks.fetch({ @@ -109,21 +100,12 @@ add_task(async function () { Assert.equal(toolbarItem.title, "Toolbar Link Before"); // Check the custom favicon exist for this bookmark - let faviconItem = await waitForResolvedPromise( - () => { - return PlacesUtils.promiseFaviconData(toolbarItem.url.href); - }, - "Favicon not found", - 10 - ); - Assert.equal(faviconItem.uri.spec, "https://example.org/favicon.png"); - Assert.greater(faviconItem.dataLen, 0); - Assert.equal(faviconItem.mimeType, "image/png"); - - let base64Icon = - "data:image/png;base64," + - base64EncodeString(String.fromCharCode.apply(String, faviconItem.data)); - Assert.equal(base64Icon, SMALLPNG_DATA_URI.spec); + favicon = await PlacesUtils.favicons.getFaviconForPage(toolbarItem.url.URI); + Assert.ok(favicon, "Favicon should be found"); + Assert.equal(favicon.uri.spec, "https://example.org/favicon.png"); + Assert.greater(favicon.rawData.length, 0); + Assert.equal(favicon.mimeType, "image/png"); + Assert.equal(favicon.dataURI.spec, SMALLPNG_DATA_URI.spec); toolbarItem = await PlacesUtils.bookmarks.fetch({ parentGuid: PlacesUtils.bookmarks.toolbarGuid, diff --git a/browser/components/pocket/test/browser.toml b/browser/components/pocket/test/browser.toml index 0fc4533e2d3..4c478bf14c5 100644 --- a/browser/components/pocket/test/browser.toml +++ b/browser/components/pocket/test/browser.toml @@ -13,6 +13,7 @@ support-files = [ ["browser_pocket_panel.js"] skip-if = [ "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1781272 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1781272 ] ["browser_pocket_panel_closemenu.js"] diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js index 0c810679331..ceea471c9d9 100644 --- a/browser/components/preferences/privacy.js +++ b/browser/components/preferences/privacy.js @@ -77,7 +77,7 @@ XPCOMUtils.defineLazyPreferenceGetter( ); ChromeUtils.defineESModuleGetters(this, { - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", Sanitizer: "resource:///modules/Sanitizer.sys.mjs", SelectableProfileService: "resource:///modules/profiles/SelectableProfileService.sys.mjs", diff --git a/browser/components/preferences/tests/browser_privacy_dnsoverhttps.js b/browser/components/preferences/tests/browser_privacy_dnsoverhttps.js index 1498541fbd1..8d20a4eaf0c 100644 --- a/browser/components/preferences/tests/browser_privacy_dnsoverhttps.js +++ b/browser/components/preferences/tests/browser_privacy_dnsoverhttps.js @@ -11,14 +11,17 @@ const { EnterprisePolicyTesting, PoliciesPrefTracker } = ); ChromeUtils.defineESModuleGetters(this, { - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", - DoHController: "resource:///modules/DoHController.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", + DoHController: "resource://gre/modules/DoHController.sys.mjs", DoHTestUtils: "resource://testing-common/DoHTestUtils.sys.mjs", }); const { MockRegistrar } = ChromeUtils.importESModule( "resource://testing-common/MockRegistrar.sys.mjs" ); +const gDNSOverride = Cc[ + "@mozilla.org/network/native-dns-override;1" +].getService(Ci.nsINativeDNSResolverOverride); const TRR_MODE_PREF = "network.trr.mode"; const TRR_URI_PREF = "network.trr.uri"; @@ -40,9 +43,7 @@ const defaultPrefValues = Object.freeze({ // is in progress, before we've actually disabled TRR, and would cause a crash // due to connecting to a non-local IP. // To prevent that we override the IP to a local address. -Cc["@mozilla.org/network/native-dns-override;1"] - .getService(Ci.nsINativeDNSResolverOverride) - .addIPOverride("mozilla.cloudflare-dns.com", "127.0.0.1"); +gDNSOverride.addIPOverride("mozilla.cloudflare-dns.com", "127.0.0.1"); async function clearEvents() { Services.telemetry.clearEvents(); @@ -67,6 +68,17 @@ async function getEvent(filter1, filter2) { return event; } +// Mock parental controls service in order to enable it +let parentalControlsService = { + parentalControlsEnabled: true, + QueryInterface: ChromeUtils.generateQI(["nsIParentalControlsService"]), +}; +let mockParentalControlsServiceCid = undefined; + +async function setMockParentalControlEnabled(aEnabled) { + parentalControlsService.parentalControlsEnabled = aEnabled; +} + async function resetPrefs() { await DoHTestUtils.resetRemoteSettingsConfig(); await DoHController._uninit(); @@ -86,14 +98,30 @@ Services.prefs.setStringPref("network.trr.confirmationNS", "skip"); registerCleanupFunction(async () => { await resetPrefs(); Services.prefs.clearUserPref("network.trr.confirmationNS"); + + if (mockParentalControlsServiceCid != undefined) { + MockRegistrar.unregister(mockParentalControlsServiceCid); + mockParentalControlsServiceCid = undefined; + Services.dns.reloadParentalControlEnabled(); + } }); add_setup(async function setup() { + mockParentalControlsServiceCid = MockRegistrar.register( + "@mozilla.org/parental-controls-service;1", + parentalControlsService + ); + Services.dns.reloadParentalControlEnabled(); + await SpecialPowers.pushPrefEnv({ set: [["toolkit.telemetry.testing.overrideProductsCheck", true]], }); await DoHTestUtils.resetRemoteSettingsConfig(); + + gDNSOverride.addIPOverride("use-application-dns.net.", "4.1.1.1"); + + setMockParentalControlEnabled(false); }); function waitForPrefObserver(name) { @@ -110,27 +138,6 @@ function waitForPrefObserver(name) { }); } -// Mock parental controls service in order to enable it -let parentalControlsService = { - parentalControlsEnabled: true, - QueryInterface: ChromeUtils.generateQI(["nsIParentalControlsService"]), -}; -let mockParentalControlsServiceCid = undefined; - -async function setMockParentalControlEnabled(aEnabled) { - if (mockParentalControlsServiceCid != undefined) { - MockRegistrar.unregister(mockParentalControlsServiceCid); - mockParentalControlsServiceCid = undefined; - } - if (aEnabled) { - mockParentalControlsServiceCid = MockRegistrar.register( - "@mozilla.org/parental-controls-service;1", - parentalControlsService - ); - } - Services.dns.reloadParentalControlEnabled(); -} - add_task(async function testParentalControls() { async function withConfiguration(configuration, fn) { info("testParentalControls"); @@ -505,6 +512,10 @@ async function testWithProperties(props, startTime) { is(modeValue, props.expectedModeValue, "mode pref has expected value"); } + if (props.hasOwnProperty(ROLLOUT_ENABLED_PREF)) { + Services.prefs.clearUserPref(ROLLOUT_ENABLED_PREF); + } + gBrowser.removeCurrentTab(); info(Date.now() - startTime + ": testWithProperties: fin"); } @@ -846,7 +857,8 @@ add_task(async function testRemoteSettingsEnable() { let status = doc.getElementById("dohStatus"); await TestUtils.waitForCondition( - () => document.l10n.getAttributes(status).args.status == "Active" + () => document.l10n.getAttributes(status).args.status == "Active", + "Waiting for remote settings to be processed" ); is( document.l10n.getAttributes(status).args.status, @@ -863,7 +875,8 @@ add_task(async function testRemoteSettingsEnable() { await TestUtils.waitForCondition( () => document.l10n.getAttributes(provider).args.name == - DoHConfigController.currentConfig.providerList[0].UIName + DoHConfigController.currentConfig.providerList[0].UIName, + "waiting for correct UI name" ); is( document.l10n.getAttributes(provider).args.name, @@ -876,14 +889,16 @@ add_task(async function testRemoteSettingsEnable() { let win = doc.ownerGlobal; EventUtils.synthesizeMouseAtCenter(option, {}, win); - await TestUtils.waitForCondition(() => - Services.prefs.prefHasUserValue("doh-rollout.disable-heuristics") + await TestUtils.waitForCondition( + () => Services.prefs.prefHasUserValue("doh-rollout.disable-heuristics"), + "Waiting for disable-heuristics" ); is(provider.hidden, false); await TestUtils.waitForCondition( () => document.l10n.getAttributes(provider).args.name == - DoHConfigController.currentConfig.providerList[0].UIName + DoHConfigController.currentConfig.providerList[0].UIName, + "waiting for correct UI name" ); is( document.l10n.getAttributes(provider).args.name, @@ -899,7 +914,10 @@ add_task(async function testRemoteSettingsEnable() { option.scrollIntoView(); win = doc.ownerGlobal; EventUtils.synthesizeMouseAtCenter(option, {}, win); - await TestUtils.waitForCondition(() => status.innerHTML == "Status: Off"); + await TestUtils.waitForCondition( + () => status.innerHTML == "Status: Off", + "Waiting for Status OFF" + ); is( Services.prefs.getIntPref("network.trr.mode"), Ci.nsIDNSService.MODE_TRROFF @@ -907,6 +925,16 @@ add_task(async function testRemoteSettingsEnable() { is(provider.hidden, true, "Expecting provider to be hidden when DoH is off"); gBrowser.removeCurrentTab(); + + await DoHTestUtils.loadRemoteSettingsConfig({ + providers: "", + rolloutEnabled: false, + steeringEnabled: false, + steeringProviders: "", + autoDefaultEnabled: false, + autoDefaultProviders: "", + id: "global", + }); }); add_task(async function testEnterprisePolicy() { @@ -931,6 +959,8 @@ add_task(async function testEnterprisePolicy() { }); gBrowser.removeCurrentTab(); + // Set an empty policy before stopping the policy tracker + await EnterprisePolicyTesting.setupPolicyEngineWithJson({}); EnterprisePolicyTesting.resetRunOnceState(); PoliciesPrefTracker.stop(); } diff --git a/browser/components/profiles/tests/browser/browser.toml b/browser/components/profiles/tests/browser/browser.toml index 51e66750050..e22ff85355a 100644 --- a/browser/components/profiles/tests/browser/browser.toml +++ b/browser/components/profiles/tests/browser/browser.toml @@ -34,6 +34,7 @@ head = "../unit/head.js head.js" ["browser_notify_changes.js"] run-if = ["os != 'linux'"] # Linux clients cannot remote themselves. +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt && !socketprocess_networking"] # Bug 1929273 ["browser_preferences.js"] fail-if = ["a11y_checks"] # Bug 1955503 @@ -42,12 +43,13 @@ fail-if = ["a11y_checks"] # Bug 1955503 ["browser_test_last_tab.js"] skip-if = [ - "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && asan", # Bug 1950795 - "os == 'win' && os_version == '11.26100' && debug", # Bug 1950795 - "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1950795 - "os == 'mac' && os_version == '10.15' && processor == 'x86_64'", # Bug 1950795 "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && socketprocess_networking", # Bug 1950795 "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && swgl", # Bug 1950795 + "os == 'mac' && os_version == '10.15' && processor == 'x86_64'", # Bug 1950795 + "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1950795 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1950795 + "os == 'win' && os_version == '11.26100' && debug", # Bug 1950795 + "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && asan", # Bug 1950795 ] ["browser_test_nimbus_feature.js"] @@ -58,6 +60,7 @@ skip-if = [ skip-if = [ "os == 'win' && os_version == '11.26100' && opt", # Bug 1948374 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1948374 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1948374 "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1948374 "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && opt", # Bug 1948374 ] diff --git a/browser/components/search/BrowserSearchTelemetry.sys.mjs b/browser/components/search/BrowserSearchTelemetry.sys.mjs index 91dbd046289..a966b6eb473 100644 --- a/browser/components/search/BrowserSearchTelemetry.sys.mjs +++ b/browser/components/search/BrowserSearchTelemetry.sys.mjs @@ -55,7 +55,7 @@ class BrowserSearchTelemetryHandler { * Determines if we should record a search for this browser instance. * Private Browsing mode is normally skipped. * - * @param {browser} browser + * @param {XULBrowserElement} browser * The browser where the search was loaded. * @returns {boolean} * True if the search should be recorded, false otherwise. @@ -127,7 +127,7 @@ class BrowserSearchTelemetryHandler { * Telemetry records only search counts per engine and action origin, but * nothing pertaining to the search contents themselves. * - * @param {browser} browser + * @param {XULBrowserElement} browser * The browser where the search originated. * @param {nsISearchEngine} engine * The engine handling the search. @@ -232,11 +232,27 @@ class BrowserSearchTelemetryHandler { } } + /** + * Records visits to a search engine's search form. + * + * @param {nsISearchEngine} engine + * The engine whose search form is being visited. + * @param {string} source + * Where the search form was opened from. + * This can be "urlbar" or "searchbar". + */ + recordSearchForm(engine, source) { + Glean.sap.searchFormCounts.record({ + source, + provider_id: engine.isAppProvided ? engine.id : "other", + }); + } + /** * This function handles the "urlbar", "urlbar-oneoff", "searchbar" and * "searchbar-oneoff" sources. * - * @param {browser} browser + * @param {XULBrowserElement} browser * The browser where the search originated. * @param {nsISearchEngine} engine * The engine handling the search. diff --git a/browser/components/search/content/searchbar.js b/browser/components/search/content/searchbar.js index 2ba9571364d..5c2fda929cd 100644 --- a/browser/components/search/content/searchbar.js +++ b/browser/components/search/content/searchbar.js @@ -388,13 +388,6 @@ this.telemetrySelectedIndex = -1; - lazy.BrowserSearchTelemetry.recordSearch( - gBrowser.selectedBrowser, - engine, - "searchbar", - details - ); - // Record when the user uses the search bar Services.prefs.setStringPref( "browser.search.widget.lastUsed", @@ -413,6 +406,28 @@ params[key] = aParams[key]; } } + + if (aWhere == "tab") { + gBrowser.tabContainer.addEventListener( + "TabOpen", + event => + lazy.BrowserSearchTelemetry.recordSearch( + event.target.linkedBrowser, + engine, + "searchbar", + details + ), + { once: true } + ); + } else { + lazy.BrowserSearchTelemetry.recordSearch( + gBrowser.selectedBrowser, + engine, + "searchbar", + details + ); + } + openTrustedLinkIn(submission.uri.spec, aWhere, params); } @@ -504,6 +519,7 @@ this._needBrowserFocusAtEnterKeyUp = true; } + lazy.BrowserSearchTelemetry.recordSearchForm(engine, "searchbar"); openTrustedLinkIn(searchForm, where, params); } diff --git a/browser/components/search/metrics.yaml b/browser/components/search/metrics.yaml index 38244ac9596..5b73bed8d9d 100644 --- a/browser/components/search/metrics.yaml +++ b/browser/components/search/metrics.yaml @@ -217,6 +217,34 @@ sap: expires: never telemetry_mirror: h#SEARCH_COUNTS + search_form_counts: + type: event + description: > + Records how often users visit the homepages of search engines (also + known as SearchForm) using a SAP. It only counts how many visits were + initiated, not how many homepages were loaded successfully. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1915252 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1915252 + data_sensitivity: + - interaction + notification_emails: + - fx-search-telemetry@mozilla.com + expires: never + extra_keys: + source: + description: > + The search access point from which the user initiated the search. + Possible values are `searchbar` and `urlbar`. + type: string + provider_id: + description: > + The identifier of the search engine provider that is being used for the + search. Note this may be different to the identifier of the provider in + SERP reports. For user installed engines, this will be the string `other`. + type: string + serp: impression: type: event diff --git a/browser/components/search/test/browser/telemetry/browser.toml b/browser/components/search/test/browser/telemetry/browser.toml index 3b908349894..624d405cd72 100644 --- a/browser/components/search/test/browser/telemetry/browser.toml +++ b/browser/components/search/test/browser/telemetry/browser.toml @@ -184,6 +184,8 @@ support-files = [ "telemetrySearchSuggestions.xml", ] +["browser_search_telemetry_searchform.js"] + ["browser_search_telemetry_shopping.js"] support-files = ["searchTelemetryAd_shopping.html"] diff --git a/browser/components/search/test/browser/telemetry/browser_search_telemetry_searchform.js b/browser/components/search/test/browser/telemetry/browser_search_telemetry_searchform.js new file mode 100644 index 00000000000..02cac2662c9 --- /dev/null +++ b/browser/components/search/test/browser/telemetry/browser_search_telemetry_searchform.js @@ -0,0 +1,164 @@ +/* Any copyright is dedicated to the Public Domain. + https://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const CONFIG = [ + { + identifier: "defaultEngine", + }, + { + identifier: "second_engine", + base: { + name: "Second Engine", + urls: { + search_form: { + base: "https://www.example.com/searchform", + }, + }, + }, + }, +]; +const TEST_ENGINE_BASENAME = "testEngine.xml"; +const TEST_ENGINE_NAME = "Foo"; + +function findOneOff(engineName) { + let oneOffButtons = document.getElementById("PopupSearchAutoComplete") + .oneOffButtons.buttons; + let oneOffChildren = [...oneOffButtons.children]; + let oneOffButton = oneOffChildren.find( + node => node.engine?.name == engineName + ); + Assert.notEqual( + oneOffButton, + undefined, + `One-off for ${engineName} should exist` + ); + return oneOffButton; +} + +async function openSearchbarPopup(searchBarValue) { + let searchBar = document.getElementById("searchbar"); + + searchBar.focus(); + searchBar.value = searchBarValue; + if (searchBar.textbox.popupOpen) { + info("searchPanel is already open"); + return; + } + let searchPopup = document.getElementById("PopupSearchAutoComplete"); + let shownPromise = BrowserTestUtils.waitForEvent(searchPopup, "popupshown"); + + let searchIcon = searchBar.querySelector(".searchbar-search-button"); + let oneOffInstance = searchPopup.oneOffButtons; + let builtPromise = BrowserTestUtils.waitForEvent(oneOffInstance, "rebuild"); + + info("Opening search panel"); + EventUtils.synthesizeMouseAtCenter(searchIcon, {}); + await Promise.all([shownPromise, builtPromise]); +} + +add_setup(async function () { + await SearchTestUtils.updateRemoteSettingsConfig(CONFIG); + await SearchTestUtils.installOpenSearchEngine({ + url: getRootDirectory(gTestPath) + "../" + TEST_ENGINE_BASENAME, + }); + await gCUITestUtils.addSearchBar(); + + registerCleanupFunction(async () => { + gCUITestUtils.removeSearchBar(); + resetTelemetry(); + }); +}); + +add_task(async function test_appProvidedSearchbar() { + await openSearchbarPopup(""); + let oneOff = findOneOff("Second Engine"); + EventUtils.synthesizeMouseAtCenter(oneOff, { shiftKey: true }); + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + Assert.equal(events.length, 1, "Event was recorded."); + Assert.equal(events[0].extra.source, "searchbar", "Source is correct"); + Assert.equal(events[0].extra.provider_id, "second_engine", "Id is correct"); + resetTelemetry(); +}); + +add_task(async function test_extensionSearchbar() { + await openSearchbarPopup(""); + let oneOff = findOneOff(TEST_ENGINE_NAME); + EventUtils.synthesizeMouseAtCenter(oneOff, { shiftKey: true }); + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + Assert.equal(events.length, 1, "Event was recorded"); + Assert.equal(events[0].extra.source, "searchbar", "Source is correct"); + Assert.equal(events[0].extra.provider_id, "other", "Id is correct"); + resetTelemetry(); +}); + +add_task(async function test_actualSearchSearchbar() { + // Enter something in the searchbar to start an actual search. + await openSearchbarPopup("foo"); + let oneOff = findOneOff("Second Engine"); + EventUtils.synthesizeMouseAtCenter(oneOff, { shiftKey: true }); + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + // Since we used the one off button to search (not to open the search form), + // no event should be recorded in `sap.searchFormCounts`. + Assert.equal(events, null, "No search form event is recorded for searches"); + resetTelemetry(); +}); + +add_task(async function test_appProvidedUrlbar() { + let popup = await UrlbarTestUtils.openSearchModeSwitcher(window); + info("Choose Second Engine in the unified search button popup."); + let item = popup.querySelector('menuitem[label="Second Engine"]'); + let popupHidden = UrlbarTestUtils.searchModeSwitcherPopupClosed(window); + EventUtils.synthesizeMouseAtCenter(item, { shiftKey: true }); + await popupHidden; + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + Assert.equal(events.length, 1, "Event was recorded"); + Assert.equal(events[0].extra.source, "urlbar", "Source is correct"); + Assert.equal(events[0].extra.provider_id, "second_engine", "Id is correct"); + resetTelemetry(); +}); + +add_task(async function test_extensionUrlbar() { + let popup = await UrlbarTestUtils.openSearchModeSwitcher(window); + info("Choose extension engine in the unified search button popup."); + let item = popup.querySelector(`menuitem[label="${TEST_ENGINE_NAME}"]`); + let popupHidden = UrlbarTestUtils.searchModeSwitcherPopupClosed(window); + EventUtils.synthesizeMouseAtCenter(item, { shiftKey: true }); + await popupHidden; + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + Assert.equal(events.length, 1, "Event was recorded"); + Assert.equal(events[0].extra.source, "urlbar", "Source is correct"); + Assert.equal(events[0].extra.provider_id, "other"); + resetTelemetry(); +}); + +add_task(async function test_actualSearchUrlbar() { + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "foo", + }); + let popup = await UrlbarTestUtils.openSearchModeSwitcher(window); + info("Shift-click Second Engine in the unified search button popup."); + let item = popup.querySelector('menuitem[label="Second Engine"]'); + let popupHidden = UrlbarTestUtils.searchModeSwitcherPopupClosed(window); + EventUtils.synthesizeMouseAtCenter(item, { shiftKey: true }); + await popupHidden; + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + // Since we used the unified search button to search (not to open the search + // form), no event should be recorded in `sap.searchFormCounts`. + Assert.equal(events, null, "No search form event was recorded"); + resetTelemetry(); +}); diff --git a/browser/components/search/test/browser/telemetry/browser_search_telemetry_sources.js b/browser/components/search/test/browser/telemetry/browser_search_telemetry_sources.js index 4295d2019c4..33ea4446fc0 100644 --- a/browser/components/search/test/browser/telemetry/browser_search_telemetry_sources.js +++ b/browser/components/search/test/browser/telemetry/browser_search_telemetry_sources.js @@ -37,7 +37,7 @@ const TEST_PROVIDER_INFO = [ /** * Returns the index of the first search suggestion in the urlbar results. * - * @returns {number} An index, or -1 if there are no search suggestions. + * @returns {Promise} An index, or -1 if there are no search suggestions. */ async function getFirstSuggestionIndex() { const matchCount = UrlbarTestUtils.getResultCount(window); @@ -80,6 +80,7 @@ add_setup(async function () { suggest_url: "https://example.org/browser/browser/components/search/test/browser/searchSuggestionEngine.sjs", suggest_url_get_params: "query={searchTerms}", + name: "Example", }, { setAsDefault: true } ); @@ -203,6 +204,77 @@ add_task(async function test_source_urlbar() { ); }); +add_task(async function test_source_urlbar_newtab() { + let tab; + await track_ad_click( + "urlbar", + "urlbar", + async () => { + // Load a page because alt doesn't open new tabs on about:newtab. + BrowserTestUtils.startLoadingURIString( + gBrowser.selectedBrowser, + "https://example.com" + ); + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "searchSuggestion", + }); + let idx = await getFirstSuggestionIndex(); + Assert.greaterOrEqual(idx, 0, "there should be a first suggestion"); + while (idx--) { + EventUtils.sendKey("down"); + } + + let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser); + EventUtils.synthesizeKey("VK_RETURN", { altKey: true }); + tab = await newTabPromise; + return tab; + }, + async () => { + BrowserTestUtils.removeTab(tab); + } + ); +}); + +add_task(async function test_source_urlbar_oneoffs_newtab() { + // Enable legacy one off buttons. + await SpecialPowers.pushPrefEnv({ + set: [["browser.urlbar.scotchBonnet.enableOverride", false]], + }); + let tab; + await track_ad_click( + "urlbar", + "urlbar", + async () => { + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "searchSuggestion", + }); + + let oneOffs = + UrlbarTestUtils.getOneOffSearchButtons(window).getSelectableButtons( + true + ); + + let engines = await Services.search.getEngines(); + let index = engines.findIndex(e => e.name == "Example"); + let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser); + EventUtils.synthesizeMouseAtCenter(oneOffs[index], { + accelKey: true, + shiftKey: true, + }); + tab = await newTabPromise; + return tab; + }, + async () => { + BrowserTestUtils.removeTab(tab); + } + ); + await SpecialPowers.popPrefEnv(); +}); + add_task(async function test_source_urlbar_handoff() { let tab; await track_ad_click( @@ -324,6 +396,38 @@ add_task(async function test_source_searchbar() { ); }); +add_task(async function test_source_searchbar_newtab() { + let tab; + await track_ad_click( + "searchbar", + "searchbar", + async () => { + let sb = document.getElementById("searchbar"); + // Write the search query in the searchbar. + sb.focus(); + sb.value = "searchSuggestion"; + sb.textbox.controller.startSearch("searchSuggestion"); + // Wait for the popup to show. + await BrowserTestUtils.waitForEvent(sb.textbox.popup, "popupshown"); + // And then for the search to complete. + await BrowserTestUtils.waitForCondition( + () => + sb.textbox.controller.searchStatus >= + Ci.nsIAutoCompleteController.STATUS_COMPLETE_NO_MATCH, + "The search in the searchbar must complete." + ); + + let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser); + EventUtils.synthesizeKey("VK_RETURN", { altKey: true }); + tab = await newTabPromise; + return tab; + }, + async () => { + BrowserTestUtils.removeTab(tab); + } + ); +}); + add_task(async function test_source_system() { let tab; await track_ad_click( diff --git a/browser/components/sessionstore/test/browser.toml b/browser/components/sessionstore/test/browser.toml index b64dcad541e..a40f1a6d099 100644 --- a/browser/components/sessionstore/test/browser.toml +++ b/browser/components/sessionstore/test/browser.toml @@ -247,8 +247,8 @@ skip-if = ["true"] # Bug 1646894 ["browser_restoreLastClosedTabOrWindowOrSession.js"] skip-if = [ "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1838996 - "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && asan", # Bug 1838996 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1838996 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1838996 ] ["browser_restoreTabContainer.js"] diff --git a/browser/components/sessionstore/test/browser_oldformat.toml b/browser/components/sessionstore/test/browser_oldformat.toml index 147ab7be751..48d97885529 100644 --- a/browser/components/sessionstore/test/browser_oldformat.toml +++ b/browser/components/sessionstore/test/browser_oldformat.toml @@ -204,6 +204,7 @@ https_first_disabled = true ["browser_590268.js"] ["browser_590563.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64'"] ["browser_595601-restore_hidden.js"] diff --git a/browser/components/shell/nsGNOMEShellSearchProvider.cpp b/browser/components/shell/nsGNOMEShellSearchProvider.cpp index 64d3d888ce8..1b721ecaa55 100644 --- a/browser/components/shell/nsGNOMEShellSearchProvider.cpp +++ b/browser/components/shell/nsGNOMEShellSearchProvider.cpp @@ -8,7 +8,6 @@ #include "nsGNOMEShellSearchProvider.h" #include "nsToolkitCompsCID.h" -#include "nsIFaviconService.h" #include "base/message_loop.h" // for MessageLoop #include "base/task.h" // for NewRunnableMethod, etc #include "mozilla/gfx/2D.h" @@ -24,6 +23,7 @@ #include "nsIOpenTabsProvider.h" #include "imgIContainer.h" #include "imgITools.h" +#include "mozilla/places/nsFaviconService.h" using namespace mozilla; using namespace mozilla::gfx; @@ -62,27 +62,6 @@ static const char* introspect_template = "\n" "\n"; -class AsyncFaviconDataReady final : public nsIFaviconDataCallback { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIFAVICONDATACALLBACK - - AsyncFaviconDataReady(RefPtr aSearchResult, - int aIconIndex, int aTimeStamp) - : mSearchResult(std::move(aSearchResult)), - mIconIndex(aIconIndex), - mTimeStamp(aTimeStamp) {} - - private: - ~AsyncFaviconDataReady() {} - - RefPtr mSearchResult; - int mIconIndex; - int mTimeStamp; -}; - -NS_IMPL_ISUPPORTS(AsyncFaviconDataReady, nsIFaviconDataCallback) - // Inspired by SurfaceToPackedBGRA static UniquePtr SurfaceToPackedRGBA(DataSourceSurface* aSurface) { IntSize size = aSurface->GetSize(); @@ -116,22 +95,35 @@ static UniquePtr SurfaceToPackedRGBA(DataSourceSurface* aSurface) { return imageBuffer; } -NS_IMETHODIMP -AsyncFaviconDataReady::OnComplete(nsIURI* aFaviconURI, uint32_t aDataLen, - const uint8_t* aData, - const nsACString& aMimeType, - uint16_t aWidth) { +static nsresult UpdateHistoryIcon( + const places::FaviconPromise::ResolveOrRejectValue& aPromiseResult, + const RefPtr& aSearchResult, + int aIconIndex, int aTimeStamp) { // This is a callback from some previous search so we don't want it - if (mTimeStamp != mSearchResult->GetTimeStamp() || !aData || !aDataLen) { + if (aTimeStamp != aSearchResult->GetTimeStamp()) { return NS_ERROR_FAILURE; } + nsCOMPtr favicon = + aPromiseResult.IsResolve() ? aPromiseResult.ResolveValue() : nullptr; + if (!favicon) { + return NS_ERROR_FAILURE; + } + + // Get favicon content. + nsTArray rawData; + nsresult rv = favicon->GetRawData(rawData); + NS_ENSURE_SUCCESS(rv, rv); + nsAutoCString mimeType; + rv = favicon->GetMimeType(mimeType); + NS_ENSURE_SUCCESS(rv, rv); + // Decode the image from the format it was returned to us in (probably PNG) nsCOMPtr container; nsCOMPtr imgtool = do_CreateInstance("@mozilla.org/image/tools;1"); - nsresult rv = imgtool->DecodeImageFromBuffer( - reinterpret_cast(aData), aDataLen, aMimeType, - getter_AddRefs(container)); + rv = imgtool->DecodeImageFromBuffer( + reinterpret_cast(rawData.Elements()), rawData.Length(), + mimeType, getter_AddRefs(container)); NS_ENSURE_SUCCESS(rv, rv); RefPtr surface = container->GetFrame( @@ -149,9 +141,9 @@ AsyncFaviconDataReady::OnComplete(nsIURI* aFaviconURI, uint32_t aDataLen, return NS_ERROR_OUT_OF_MEMORY; } - mSearchResult->SetHistoryIcon(mTimeStamp, std::move(data), + aSearchResult->SetHistoryIcon(aTimeStamp, std::move(data), surface->GetSize().width, - surface->GetSize().height, mIconIndex); + surface->GetSize().height, aIconIndex); return NS_OK; } @@ -432,8 +424,7 @@ void nsGNOMEShellHistorySearchResult::HandleSearchResultReply() { nsresult rv = mHistResultContainer->GetChildCount(&childCount); if (NS_SUCCEEDED(rv) && childCount > 0) { // Obtain the favicon service and get the favicon for the specified page - nsCOMPtr favIconSvc( - do_GetService("@mozilla.org/browser/favicon-service;1")); + auto* favIconSvc = nsFaviconService::GetFaviconService(); nsCOMPtr ios(do_GetService(NS_IOSERVICE_CONTRACTID)); if (childCount > MAX_SEARCH_RESULTS_NUM) { @@ -453,11 +444,15 @@ void nsGNOMEShellHistorySearchResult::HandleSearchResultReply() { nsAutoCString uri; child->GetUri(uri); + RefPtr self = this; nsCOMPtr iconIri; ios->NewURI(uri, nullptr, nullptr, getter_AddRefs(iconIri)); - nsCOMPtr callback = - new AsyncFaviconDataReady(this, i, mTimeStamp); - favIconSvc->GetFaviconDataForPage(iconIri, callback, 0); + favIconSvc->AsyncGetFaviconForPage(iconIri)->Then( + GetMainThreadSerialEventTarget(), __func__, + [self, iconIndex = i, timeStamp = mTimeStamp]( + const places::FaviconPromise::ResolveOrRejectValue& aResult) { + UpdateHistoryIcon(aResult, self, iconIndex, timeStamp); + }); bool isOpen = false; for (const auto& openuri : mOpenTabs) { diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js index face3b90047..41a9bfd4e59 100644 --- a/browser/components/sidebar/browser-sidebar.js +++ b/browser/components/sidebar/browser-sidebar.js @@ -1081,13 +1081,12 @@ var SidebarController = { let fromRects = this._getRects(animatingElements); - // We need to wait for rAF for lit to re-render, and us to get the final - // width. This is a bit unfortunate but alas... - let toRects = await new Promise(resolve => { - requestAnimationFrame(() => { - resolve(this._getRects(animatingElements)); - }); + // We need to wait for lit to re-render, and us to get the final width. + // This is a bit unfortunate but alas... + await new Promise(resolve => { + queueMicrotask(() => resolve(this.sidebarMain.updateComplete)); }); + let toRects = this._getRects(animatingElements); const options = { duration: document.documentElement.hasAttribute("sidebar-expand-on-hover") diff --git a/browser/components/sidebar/tests/browser/browser_glean_sidebar.js b/browser/components/sidebar/tests/browser/browser_glean_sidebar.js index cbb8a30d28c..83384f34d1b 100644 --- a/browser/components/sidebar/tests/browser/browser_glean_sidebar.js +++ b/browser/components/sidebar/tests/browser/browser_glean_sidebar.js @@ -256,7 +256,8 @@ add_task(async function test_contextual_manager_toggle() { await testSidebarToggle("viewCPMSidebar", gleanEvent); await testCustomizeToggle( "viewCPMSidebar", - Glean.contextualManager.passwordsEnabled + Glean.contextualManager.passwordsEnabled, + false // Remove this in bug 1957425 ); await SpecialPowers.popPrefEnv(); await SidebarController.waitUntilStable(); diff --git a/browser/components/topsites/TopSites.sys.mjs b/browser/components/topsites/TopSites.sys.mjs index d3aa680b9fa..f0319a69ea1 100644 --- a/browser/components/topsites/TopSites.sys.mjs +++ b/browser/components/topsites/TopSites.sys.mjs @@ -1199,18 +1199,16 @@ export class FaviconProvider { * @param {nsIURI} uri * Page to check for favicon data * @returns {object} - * A promise of an object (possibly null) containing the data + * Favicon info object. If there is no data in DB, return null. */ - getFaviconInfo(uri) { - return new Promise(resolve => - lazy.PlacesUtils.favicons.getFaviconDataForPage( - uri, - // Package up the icon data in an object if we have it; otherwise null - (iconUri, faviconLength, favicon, mimeType, faviconSize) => - resolve(iconUri ? { iconUri, faviconSize } : null), - lazy.NewTabUtils.activityStreamProvider.THUMB_FAVICON_SIZE - ) + async getFaviconInfo(uri) { + let favicon = await lazy.PlacesUtils.favicons.getFaviconForPage( + uri, + lazy.NewTabUtils.activityStreamProvider.THUMB_FAVICON_SIZE ); + return favicon + ? { iconUri: favicon.uri, faviconSize: favicon.width } + : null; } /** diff --git a/browser/components/topsites/test/unit/test_FaviconProvider.js b/browser/components/topsites/test/unit/test_FaviconProvider.js index b3881a1ced0..2d12dc60fa2 100644 --- a/browser/components/topsites/test/unit/test_FaviconProvider.js +++ b/browser/components/topsites/test/unit/test_FaviconProvider.js @@ -110,9 +110,9 @@ add_task(async function test_fetchIcon_with_valid_favicon() { await feed.fetchIcon(TEST_PAGE_URL.spec); info("Check the database"); - const result = await PlacesUtils.promiseFaviconData(TEST_PAGE_URL); + const result = await PlacesUtils.favicons.getFaviconForPage(TEST_PAGE_URL); Assert.equal(result.mimeType, "image/svg+xml"); - Assert.equal(result.size, 65535); + Assert.equal(result.width, 65535); info("Clean up"); await PlacesTestUtils.clearFavicons(); @@ -141,14 +141,13 @@ add_task(async function test_fetchIcon_with_invalid_favicon() { await feed.fetchIcon(TEST_PAGE_URL.spec); info("Check the database"); - const result = await PlacesUtils.promiseFaviconData(TEST_PAGE_URL); + const result = await PlacesUtils.favicons.getFaviconForPage(TEST_PAGE_URL); // eslint-disable-next-line no-use-before-define const expectedFaviconData = readFileData(TEST_FAVICON_FILE); Assert.equal(result.uri.spec, `${TEST_FAVICON_URL.spec}#tippytop`); - Assert.equal(result.dataLen, expectedFaviconData.length); - Assert.deepEqual(result.data, expectedFaviconData); + Assert.deepEqual(result.rawData, expectedFaviconData); Assert.equal(result.mimeType, "image/png"); - Assert.equal(result.size, 16); + Assert.equal(result.width, 16); info("Clean up"); await PlacesTestUtils.clearFavicons(); @@ -186,15 +185,16 @@ add_task(async function test_fetchIconFromRedirects_with_valid_favicon() { info("Check the database"); await TestUtils.waitForCondition(async () => { - const result = await PlacesUtils.promiseFaviconData(destination); + const result = await PlacesUtils.favicons.getFaviconForPage(destination); return !!result; }); - const sourceResult = await PlacesUtils.promiseFaviconData(TEST_PAGE_URL); - const destinationResult = await PlacesUtils.promiseFaviconData(destination); - Assert.equal(destinationResult.dataLen, sourceResult.dataLen); - Assert.deepEqual(destinationResult.data, sourceResult.data); + const sourceResult = + await PlacesUtils.favicons.getFaviconForPage(TEST_PAGE_URL); + const destinationResult = + await PlacesUtils.favicons.getFaviconForPage(destination); + Assert.deepEqual(destinationResult.rawData, sourceResult.rawData); Assert.equal(destinationResult.mimeType, sourceResult.mimeType); - Assert.equal(destinationResult.size, sourceResult.size); + Assert.equal(destinationResult.width, sourceResult.width); info("Clean up"); await PlacesTestUtils.clearFavicons(); @@ -264,9 +264,7 @@ add_task(async function test_fetchIcon_withNetworkFetch() { // Set up mocks PlacesUtils.favicons = { - getFaviconDataForPage: sandbox - .stub() - .callsArgWith(1, null, 0, null, null, 0), + getFaviconForPage: sandbox.stub().returns(Promise.resolve(null)), setFaviconForPage: sandbox.spy(), copyFavicons: sandbox.spy(), }; @@ -298,9 +296,10 @@ add_task(async function test_fetchIcon_withInvalidDataInDb() { const sandbox = sinon.createSandbox(); // Set up mocks PlacesUtils.favicons = { - getFaviconDataForPage: sandbox + // Invalid since no width. + getFaviconForPage: sandbox .stub() - .callsArgWith(1, { spec: FAKE_SMALLPNG_DATA_URI }, 0, null, null, 0), + .returns(Promise.resolve({ iconUri: { spec: FAKE_SMALLPNG_DATA_URI } })), setFaviconForPage: sandbox.spy(), copyFavicons: sandbox.spy(), }; @@ -335,16 +334,12 @@ add_task(async function test_fetchIcon_withValidDataInDb() { const sandbox = sinon.createSandbox(); // Set up mocks PlacesUtils.favicons = { - getFaviconDataForPage: sandbox - .stub() - .callsArgWith( - 1, - { spec: FAKE_SMALLPNG_DATA_URI }, - 100, - ["dummy icon data"], - "image/png", - 16 - ), + getFaviconForPage: sandbox.stub().returns( + Promise.resolve({ + iconUri: { spec: FAKE_SMALLPNG_DATA_URI }, + width: 100, + }) + ), setFaviconForPage: sandbox.spy(), copyFavicons: sandbox.spy(), }; @@ -370,9 +365,7 @@ add_task(async function test_fetchIcon_withNoTippyTopData() { let feed = new FaviconProvider(); // Set up mocks PlacesUtils.favicons = { - getFaviconDataForPage: sandbox - .stub() - .callsArgWith(1, null, 0, null, null, 0), + getFaviconForPage: sandbox.stub().returns(Promise.resolve(null)), setFaviconForPage: sandbox.spy(), copyFavicons: sandbox.spy(), }; diff --git a/browser/components/urlbar/MerinoClient.sys.mjs b/browser/components/urlbar/MerinoClient.sys.mjs index 81d5694f4cb..bc9d34926ac 100644 --- a/browser/components/urlbar/MerinoClient.sys.mjs +++ b/browser/components/urlbar/MerinoClient.sys.mjs @@ -315,10 +315,22 @@ export class MerinoClient { this.#timeoutTimer = null; } + if (!response?.ok) { + // `recordResponse()` was already called above, no need to call it here. + return []; + } + + if (response.status == 204) { + // No content. We check for this because `response.json()` (below) throws + // in this case, and since we log the error it can spam the console. + recordResponse?.("no_suggestion"); + return []; + } + // Get the response body as an object. let body; try { - body = await response?.json(); + body = await response.json(); } catch (error) { this.logger.error("Error getting response as JSON", error); } diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs index 1137fc12043..38bc3ef48cb 100644 --- a/browser/components/urlbar/UrlbarInput.sys.mjs +++ b/browser/components/urlbar/UrlbarInput.sys.mjs @@ -720,14 +720,14 @@ export class UrlbarInput { * Where we expect the result to be opened. * @property {object} openParams * The parameters related to where the result will be opened. - * @property {Node} engine + * @property {nsISearchEngine} engine * The selected one-off's engine. */ /** * Handles an event which would cause a URL or text to be opened. * - * @param {object} [options] + * @param {object} options * Options for the navigation. * @param {Event} [options.event] * The event triggering the open. @@ -819,7 +819,21 @@ export class UrlbarInput { oneOffParams.engine, searchString ); - this._recordSearch(oneOffParams.engine, event); + if (oneOffParams.openWhere == "tab") { + this.window.gBrowser.tabContainer.addEventListener( + "TabOpen", + tabEvent => + this._recordSearch( + oneOffParams.engine, + event, + {}, + tabEvent.target.linkedBrowser + ), + { once: true } + ); + } else { + this._recordSearch(oneOffParams.engine, event); + } lazy.UrlbarUtils.addToFormHistory( this, @@ -1288,7 +1302,24 @@ export class UrlbarInput { alias: result.payload.keyword, }; const engine = Services.search.getEngineByName(result.payload.engine); - this._recordSearch(engine, event, actionDetails); + + if (where == "tab") { + // The TabOpen event is fired synchronously so tabEvent.target + // is guaranteed to be our new search tab. + this.window.gBrowser.tabContainer.addEventListener( + "TabOpen", + tabEvent => + this._recordSearch( + engine, + event, + actionDetails, + tabEvent.target.linkedBrowser + ), + { once: true } + ); + } else { + this._recordSearch(engine, event, actionDetails); + } if (!result.payload.inPrivateWindow) { lazy.UrlbarUtils.addToFormHistory( @@ -1836,8 +1867,10 @@ export class UrlbarInput { null, "search-mode-switcher" ).uri.spec; + // TODO: record SAP telemetry, see Bug 1961789. } else { url = searchEngine.searchForm; + lazy.BrowserSearchTelemetry.recordSearchForm(searchEngine, "urlbar"); } this._lastSearchString = ""; @@ -2953,18 +2986,26 @@ export class UrlbarInput { * The engine to generate the query for. * @param {Event} event * The event that triggered this query. - * @param {object} searchActionDetails + * @param {object} [searchActionDetails] * The details associated with this search query. - * @param {boolean} searchActionDetails.isSuggestion + * @param {boolean} [searchActionDetails.isSuggestion] * True if this query was initiated from a suggestion from the search engine. - * @param {boolean} searchActionDetails.alias + * @param {boolean} [searchActionDetails.alias] * True if this query was initiated via a search alias. - * @param {boolean} searchActionDetails.isFormHistory + * @param {boolean} [searchActionDetails.isFormHistory] * True if this query was initiated from a form history result. - * @param {string} searchActionDetails.url + * @param {string} [searchActionDetails.url] * The url this query was triggered with. + * @param {XULBrowserElement} [browser] + * The browser where the search is being opened. + * Defaults to the window's selected browser. */ - _recordSearch(engine, event, searchActionDetails = {}) { + _recordSearch( + engine, + event, + searchActionDetails = {}, + browser = this.window.gBrowser.selectedBrowser + ) { const isOneOff = this.view.oneOffSearchButtons.eventTargetIsAOneOff(event); const searchSource = this.getSearchSource(event); @@ -2984,7 +3025,7 @@ export class UrlbarInput { // Sending a trigger to ASRouter when a search happens lazy.ASRouter.sendTriggerMessage({ - browser: this.window.gBrowser.selectedBrowser, + browser, id: "onSearch", context: { isSuggestion: searchActionDetails.isSuggestion || false, @@ -2993,16 +3034,11 @@ export class UrlbarInput { }, }); - lazy.BrowserSearchTelemetry.recordSearch( - this.window.gBrowser.selectedBrowser, - engine, - searchSource, - { - ...searchActionDetails, - isOneOff, - newtabSessionId: this._handoffSession, - } - ); + lazy.BrowserSearchTelemetry.recordSearch(browser, engine, searchSource, { + ...searchActionDetails, + isOneOff, + newtabSessionId: this._handoffSession, + }); } /** diff --git a/browser/components/urlbar/UrlbarProviderInputHistory.sys.mjs b/browser/components/urlbar/UrlbarProviderInputHistory.sys.mjs index 840f5c2d5f7..60ffb3a6e6a 100644 --- a/browser/components/urlbar/UrlbarProviderInputHistory.sys.mjs +++ b/browser/components/urlbar/UrlbarProviderInputHistory.sys.mjs @@ -23,16 +23,14 @@ ChromeUtils.defineESModuleGetters(lazy, { UrlbarResult: "resource:///modules/UrlbarResult.sys.mjs", }); -// Constants to support an alternative frecency algorithm. -const PAGES_USE_ALT_FRECENCY = Services.prefs.getBoolPref( - "places.frecency.pages.alternative.featureGate", - false -); -const PAGES_FRECENCY_FIELD = PAGES_USE_ALT_FRECENCY - ? "alt_frecency" - : "frecency"; - -const SQL_ADAPTIVE_QUERY = `/* do not warn (bug 487789) */ +ChromeUtils.defineLazyGetter(lazy, "SQL_ADAPTIVE_QUERY", () => { + // Constants to support an alternative frecency algorithm. + const PAGES_USE_ALT_FRECENCY = + lazy.PlacesUtils.history.isAlternativeFrecencyEnabled; + const PAGES_FRECENCY_FIELD = PAGES_USE_ALT_FRECENCY + ? "alt_frecency" + : "frecency"; + return `/* do not warn (bug 487789) */ SELECT h.url, h.title, EXISTS(SELECT 1 FROM moz_bookmarks WHERE fk = h.id) AS bookmarked, @@ -66,6 +64,7 @@ const SQL_ADAPTIVE_QUERY = `/* do not warn (bug 487789) */ NULL) ORDER BY rank DESC, ${PAGES_FRECENCY_FIELD} DESC LIMIT :maxResults`; +}); /** * Class used to create the provider. @@ -245,7 +244,7 @@ class ProviderInputHistory extends UrlbarProvider { */ _getAdaptiveQuery(queryContext) { return [ - SQL_ADAPTIVE_QUERY, + lazy.SQL_ADAPTIVE_QUERY, { parent: lazy.PlacesUtils.tagsFolderId, search_string: queryContext.lowerCaseSearchString, diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs index b1481a11ef3..899e808c5f8 100644 --- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs +++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs @@ -36,15 +36,6 @@ const QUERYINDEX_FRECENCY = 10; const QUERYINDEX_USERCONTEXTID = 11; const QUERYINDEX_LASTVIST = 12; -// Constants to support an alternative frecency algorithm. -const PAGES_USE_ALT_FRECENCY = Services.prefs.getBoolPref( - "places.frecency.pages.alternative.featureGate", - false -); -const PAGES_FRECENCY_FIELD = PAGES_USE_ALT_FRECENCY - ? "alt_frecency" - : "frecency"; - // This SQL query fragment provides the following: // - whether the entry is bookmarked (QUERYINDEX_BOOKMARKED) // - the bookmark title, if it is a bookmark (QUERYINDEX_BOOKMARKTITLE) @@ -65,14 +56,14 @@ const SQL_BOOKMARK_TAGS_FRAGMENT = `EXISTS(SELECT 1 FROM moz_bookmarks WHERE fk // condition once, and avoid evaluating "btitle" and "tags" when it is false. function defaultQuery(conditions = "") { let query = `SELECT :query_type, h.url, h.title, ${SQL_BOOKMARK_TAGS_FRAGMENT}, - h.visit_count, h.typed, h.id, t.open_count, ${PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date + h.visit_count, h.typed, h.id, t.open_count, ${lazy.PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date FROM moz_places h LEFT JOIN moz_openpages_temp t ON t.url = h.url AND (t.userContextId = :userContextId OR (t.userContextId <> -1 AND :userContextId IS NULL)) WHERE ( (:switchTabsEnabled AND t.open_count > 0) OR - ${PAGES_FRECENCY_FIELD} <> 0 + ${lazy.PAGES_FRECENCY_FIELD} <> 0 ) AND CASE WHEN bookmarked THEN @@ -89,7 +80,7 @@ function defaultQuery(conditions = "") { :matchBehavior, :searchBehavior, NULL) END ${conditions ? "AND" : ""} ${conditions} - ORDER BY ${PAGES_FRECENCY_FIELD} DESC, h.id DESC + ORDER BY ${lazy.PAGES_FRECENCY_FIELD} DESC, h.id DESC LIMIT :maxResults`; return query; } @@ -128,6 +119,13 @@ ChromeUtils.defineESModuleGetters(lazy, { UrlbarTokenizer: "resource:///modules/UrlbarTokenizer.sys.mjs", }); +// Constants to support an alternative frecency algorithm. +ChromeUtils.defineLazyGetter(lazy, "PAGES_FRECENCY_FIELD", () => { + return lazy.PlacesUtils.history.isAlternativeFrecencyEnabled + ? "alt_frecency" + : "frecency"; +}); + function setTimeout(callback, ms) { let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); timer.initWithCallback(callback, ms, timer.TYPE_ONE_SHOT); diff --git a/browser/components/urlbar/tests/quicksuggest/unit/test_merinoClient.js b/browser/components/urlbar/tests/quicksuggest/unit/test_merinoClient.js index 9d0ff581367..35fac269fe9 100644 --- a/browser/components/urlbar/tests/quicksuggest/unit/test_merinoClient.js +++ b/browser/components/urlbar/tests/quicksuggest/unit/test_merinoClient.js @@ -251,6 +251,20 @@ async function doFetchAndGetCalls(client, fetchArgs) { return callsByProvider; } +// Checks a 204 "No content" response. +add_task(async function noContent() { + MerinoTestUtils.server.response = { status: 204 }; + await fetchAndCheckSuggestions({ expected: [] }); + + Assert.equal( + gClient.lastFetchStatus, + "no_suggestion", + "The request should have been recorded as no_suggestion" + ); + + MerinoTestUtils.server.reset(); +}); + // Checks a response that's valid but also has some unexpected properties. add_task(async function unexpectedResponseProperties() { MerinoTestUtils.server.response.body.unexpectedString = "some value"; diff --git a/browser/config/mozconfigs/linux32/devedition b/browser/config/mozconfigs/linux32/devedition index 0eaa4a5dab8..c4f33b9cd37 100644 --- a/browser/config/mozconfigs/linux32/devedition +++ b/browser/config/mozconfigs/linux32/devedition @@ -1,7 +1,7 @@ . "$topsrcdir/browser/config/mozconfigs/linux32/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/linux32/nightly-fuzzing-asan b/browser/config/mozconfigs/linux32/nightly-fuzzing-asan index cf39c2659fd..d1be24536df 100644 --- a/browser/config/mozconfigs/linux32/nightly-fuzzing-asan +++ b/browser/config/mozconfigs/linux32/nightly-fuzzing-asan @@ -3,7 +3,7 @@ ac_add_options --enable-debug-symbols=-gline-tables-only # Add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= # ASan specific options on Linux ac_add_options --enable-valgrind diff --git a/browser/config/mozconfigs/linux64/add-on-devel b/browser/config/mozconfigs/linux64/add-on-devel index 1c66f102c11..50c4cd07057 100644 --- a/browser/config/mozconfigs/linux64/add-on-devel +++ b/browser/config/mozconfigs/linux64/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/linux64/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/linux64/debug-searchfox-clang b/browser/config/mozconfigs/linux64/debug-searchfox-clang index 127c23f514c..20bea865e45 100644 --- a/browser/config/mozconfigs/linux64/debug-searchfox-clang +++ b/browser/config/mozconfigs/linux64/debug-searchfox-clang @@ -1,5 +1,5 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 -export MOZ_AUTOMATION_CHECK=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_CHECK=0 . "$topsrcdir/build/unix/mozconfig.unix" diff --git a/browser/config/mozconfigs/linux64/debug-static-analysis-clang b/browser/config/mozconfigs/linux64/debug-static-analysis-clang index 18912a5a7f1..91d29f17092 100644 --- a/browser/config/mozconfigs/linux64/debug-static-analysis-clang +++ b/browser/config/mozconfigs/linux64/debug-static-analysis-clang @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . "$topsrcdir/build/mozconfig.common" diff --git a/browser/config/mozconfigs/linux64/devedition b/browser/config/mozconfigs/linux64/devedition index 533fe3dfb6a..97bba5d7b6e 100644 --- a/browser/config/mozconfigs/linux64/devedition +++ b/browser/config/mozconfigs/linux64/devedition @@ -1,7 +1,7 @@ . "$topsrcdir/browser/config/mozconfigs/linux64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan index c5b47a670ad..19807e2d313 100644 --- a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan +++ b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan @@ -1,7 +1,7 @@ ac_add_options --enable-debug-symbols=-gline-tables-only #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= # ASan specific options on Linux ac_add_options --enable-valgrind diff --git a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-noopt b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-noopt index 4813f17390d..c10d75391d0 100644 --- a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-noopt +++ b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-noopt @@ -1,7 +1,7 @@ ac_add_options --disable-optimize #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= # ASan specific options on Linux ac_add_options --enable-valgrind diff --git a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-nyx b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-nyx index 558d47aa749..851fc877aa5 100644 --- a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-nyx +++ b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-nyx @@ -4,7 +4,7 @@ ac_add_options --enable-debug-symbols=-gline-tables-only #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= # ASan specific options on Linux ac_add_options --enable-valgrind diff --git a/browser/config/mozconfigs/linux64/non-unified b/browser/config/mozconfigs/linux64/non-unified index ff8387d5891..7f2bd197a39 100644 --- a/browser/config/mozconfigs/linux64/non-unified +++ b/browser/config/mozconfigs/linux64/non-unified @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/browser/config/mozconfigs/linux64/nightly diff --git a/browser/config/mozconfigs/linux64/valgrind b/browser/config/mozconfigs/linux64/valgrind index 8062ddd52b3..ffaeab65d7d 100644 --- a/browser/config/mozconfigs/linux64/valgrind +++ b/browser/config/mozconfigs/linux64/valgrind @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_CHECK=0 +MOZ_AUTOMATION_CHECK=0 . $topsrcdir/browser/config/mozconfigs/linux64/nightly diff --git a/browser/config/mozconfigs/macosx64-aarch64/add-on-devel b/browser/config/mozconfigs/macosx64-aarch64/add-on-devel index 1515fa2caa4..44b19f2de12 100644 --- a/browser/config/mozconfigs/macosx64-aarch64/add-on-devel +++ b/browser/config/mozconfigs/macosx64-aarch64/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/macosx64-aarch64/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/macosx64-aarch64/cross-noopt-debug b/browser/config/mozconfigs/macosx64-aarch64/cross-noopt-debug index 77416fb9161..5a95a8e6c3e 100644 --- a/browser/config/mozconfigs/macosx64-aarch64/cross-noopt-debug +++ b/browser/config/mozconfigs/macosx64-aarch64/cross-noopt-debug @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 # Developers often build with these options for a better debugging experience. . "$topsrcdir/browser/config/mozconfigs/macosx64/debug" diff --git a/browser/config/mozconfigs/macosx64-aarch64/devedition b/browser/config/mozconfigs/macosx64-aarch64/devedition index 70f6e16eb31..f9e0159864e 100644 --- a/browser/config/mozconfigs/macosx64-aarch64/devedition +++ b/browser/config/mozconfigs/macosx64-aarch64/devedition @@ -1,7 +1,7 @@ . "$topsrcdir/browser/config/mozconfigs/macosx64-aarch64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --enable-instruments diff --git a/browser/config/mozconfigs/macosx64/add-on-devel b/browser/config/mozconfigs/macosx64/add-on-devel index fe062cb5bbe..add26e5713f 100644 --- a/browser/config/mozconfigs/macosx64/add-on-devel +++ b/browser/config/mozconfigs/macosx64/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/macosx64/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/macosx64/cross-noopt-debug b/browser/config/mozconfigs/macosx64/cross-noopt-debug index a2ba5c04bfd..87461dfd2eb 100644 --- a/browser/config/mozconfigs/macosx64/cross-noopt-debug +++ b/browser/config/mozconfigs/macosx64/cross-noopt-debug @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 # Developers often build with these options for a better debugging experience. . "$topsrcdir/browser/config/mozconfigs/macosx64/debug" diff --git a/browser/config/mozconfigs/macosx64/debug-searchfox b/browser/config/mozconfigs/macosx64/debug-searchfox index 22d0b7151e1..4d8d47fe726 100644 --- a/browser/config/mozconfigs/macosx64/debug-searchfox +++ b/browser/config/mozconfigs/macosx64/debug-searchfox @@ -1,5 +1,5 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 -export MOZ_AUTOMATION_CHECK=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_CHECK=0 . $topsrcdir/build/macosx/mozconfig.common diff --git a/browser/config/mozconfigs/macosx64/debug-static-analysis b/browser/config/mozconfigs/macosx64/debug-static-analysis index d376ec8353a..b9241faffa1 100644 --- a/browser/config/mozconfigs/macosx64/debug-static-analysis +++ b/browser/config/mozconfigs/macosx64/debug-static-analysis @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/build/macosx/mozconfig.common diff --git a/browser/config/mozconfigs/macosx64/devedition b/browser/config/mozconfigs/macosx64/devedition index 0e107db32ad..dc9b924068b 100644 --- a/browser/config/mozconfigs/macosx64/devedition +++ b/browser/config/mozconfigs/macosx64/devedition @@ -1,7 +1,7 @@ . "$topsrcdir/browser/config/mozconfigs/macosx64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --enable-instruments diff --git a/browser/config/mozconfigs/macosx64/non-unified b/browser/config/mozconfigs/macosx64/non-unified index e92d8812075..bc0bb0c9225 100644 --- a/browser/config/mozconfigs/macosx64/non-unified +++ b/browser/config/mozconfigs/macosx64/non-unified @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/browser/config/mozconfigs/macosx64/nightly diff --git a/browser/config/mozconfigs/macosx64/opt-static-analysis b/browser/config/mozconfigs/macosx64/opt-static-analysis index c5f6c3bca03..20bc7b6bf4b 100644 --- a/browser/config/mozconfigs/macosx64/opt-static-analysis +++ b/browser/config/mozconfigs/macosx64/opt-static-analysis @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/build/macosx/mozconfig.common diff --git a/browser/config/mozconfigs/win32/add-on-devel b/browser/config/mozconfigs/win32/add-on-devel index a9a2d4b7d13..0491100a2df 100644 --- a/browser/config/mozconfigs/win32/add-on-devel +++ b/browser/config/mozconfigs/win32/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/win32/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/win32/debug-static-analysis b/browser/config/mozconfigs/win32/debug-static-analysis index b04d58720fe..ad046f27e26 100644 --- a/browser/config/mozconfigs/win32/debug-static-analysis +++ b/browser/config/mozconfigs/win32/debug-static-analysis @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . "$topsrcdir/build/mozconfig.win-common" . "$topsrcdir/browser/config/mozconfigs/common" diff --git a/browser/config/mozconfigs/win32/devedition b/browser/config/mozconfigs/win32/devedition index b0304f330fa..fef90cab0ed 100644 --- a/browser/config/mozconfigs/win32/devedition +++ b/browser/config/mozconfigs/win32/devedition @@ -3,7 +3,7 @@ . "$topsrcdir/browser/config/mozconfigs/win32/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/win32/mingwclang b/browser/config/mozconfigs/win32/mingwclang index e7bca6b405c..befca5d114f 100644 --- a/browser/config/mozconfigs/win32/mingwclang +++ b/browser/config/mozconfigs/win32/mingwclang @@ -36,15 +36,15 @@ ac_add_options --disable-default-browser-agent # Relies on toast notifications w ac_add_options --disable-notification-server # Toast notifications don't build on mingw. # Find our toolchain -export HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" -export HOST_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" -export CC="$MOZ_FETCHES_DIR/clang/bin/i686-w64-mingw32-clang" -export CXX="$MOZ_FETCHES_DIR/clang/bin/i686-w64-mingw32-clang++" -export CXXFLAGS="-fms-extensions" -export CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" -export CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" -export CFLAGS="$CFLAGS -include _mingw.h" -export CXXFLAGS="$CXXFLAGS -include _mingw.h" +HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" +HOST_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" +CC="$MOZ_FETCHES_DIR/clang/bin/i686-w64-mingw32-clang" +CXX="$MOZ_FETCHES_DIR/clang/bin/i686-w64-mingw32-clang++" +CXXFLAGS="-fms-extensions" +CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" +CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" +CFLAGS="$CFLAGS -include _mingw.h" +CXXFLAGS="$CXXFLAGS -include _mingw.h" # We want to make sure we use binutils and other binaries in the tooltool # package. diff --git a/browser/config/mozconfigs/win32/noopt-debug b/browser/config/mozconfigs/win32/noopt-debug index b0a1977ebdd..d66c1393543 100644 --- a/browser/config/mozconfigs/win32/noopt-debug +++ b/browser/config/mozconfigs/win32/noopt-debug @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 # Developers often build with these options for a better debugging experience. . "$topsrcdir/browser/config/mozconfigs/win32/debug" diff --git a/browser/config/mozconfigs/win64-aarch64/devedition b/browser/config/mozconfigs/win64-aarch64/devedition index 38b2f80d58a..277a6fc7ce8 100644 --- a/browser/config/mozconfigs/win64-aarch64/devedition +++ b/browser/config/mozconfigs/win64-aarch64/devedition @@ -3,7 +3,7 @@ . "$topsrcdir/browser/config/mozconfigs/win64-aarch64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/win64/add-on-devel b/browser/config/mozconfigs/win64/add-on-devel index e46810f4c08..aa42d54743f 100644 --- a/browser/config/mozconfigs/win64/add-on-devel +++ b/browser/config/mozconfigs/win64/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/win64/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/win64/debug-searchfox b/browser/config/mozconfigs/win64/debug-searchfox index a97c74787e2..f36e4142250 100644 --- a/browser/config/mozconfigs/win64/debug-searchfox +++ b/browser/config/mozconfigs/win64/debug-searchfox @@ -1,5 +1,5 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 -export MOZ_AUTOMATION_CHECK=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_CHECK=0 . "$topsrcdir/build/mozconfig.win-common" . "$topsrcdir/browser/config/mozconfigs/common" diff --git a/browser/config/mozconfigs/win64/devedition b/browser/config/mozconfigs/win64/devedition index 21426d9a916..6bbec8c3ba7 100644 --- a/browser/config/mozconfigs/win64/devedition +++ b/browser/config/mozconfigs/win64/devedition @@ -3,7 +3,7 @@ . "$topsrcdir/browser/config/mozconfigs/win64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/win64/mingwclang b/browser/config/mozconfigs/win64/mingwclang index 1c38378e31e..a99f6f5be0d 100644 --- a/browser/config/mozconfigs/win64/mingwclang +++ b/browser/config/mozconfigs/win64/mingwclang @@ -36,15 +36,15 @@ ac_add_options --disable-default-browser-agent # Relies on toast notifications w ac_add_options --disable-notification-server # Toast notifications don't build on mingw. # Find our toolchain -export HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" -export HOST_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" -export CC="$MOZ_FETCHES_DIR/clang/bin/x86_64-w64-mingw32-clang" -export CXX="$MOZ_FETCHES_DIR/clang/bin/x86_64-w64-mingw32-clang++" -export CXXFLAGS="-fms-extensions" -export CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" -export CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" -export CFLAGS="$CFLAGS -include _mingw.h" -export CXXFLAGS="$CXXFLAGS -include _mingw.h" +HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" +HOST_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" +CC="$MOZ_FETCHES_DIR/clang/bin/x86_64-w64-mingw32-clang" +CXX="$MOZ_FETCHES_DIR/clang/bin/x86_64-w64-mingw32-clang++" +CXXFLAGS="-fms-extensions" +CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" +CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" +CFLAGS="$CFLAGS -include _mingw.h" +CXXFLAGS="$CXXFLAGS -include _mingw.h" # We want to make sure we use binutils and other binaries in the tooltool # package. diff --git a/browser/config/mozconfigs/win64/non-unified b/browser/config/mozconfigs/win64/non-unified index 920b9ee14ea..f229bcafead 100644 --- a/browser/config/mozconfigs/win64/non-unified +++ b/browser/config/mozconfigs/win64/non-unified @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/browser/config/mozconfigs/win64/nightly diff --git a/browser/config/mozconfigs/win64/noopt-debug b/browser/config/mozconfigs/win64/noopt-debug index 3a27c1fb3c5..a11b25d687d 100644 --- a/browser/config/mozconfigs/win64/noopt-debug +++ b/browser/config/mozconfigs/win64/noopt-debug @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 # Developers often build with these options for a better debugging experience. . "$topsrcdir/browser/config/mozconfigs/win64/debug" diff --git a/browser/extensions/formautofill/test/browser/browser_dynamic_form_autocompletion.js b/browser/extensions/formautofill/test/browser/browser_dynamic_form_autocompletion.js index c8d748c10d9..d64784efb0a 100644 --- a/browser/extensions/formautofill/test/browser/browser_dynamic_form_autocompletion.js +++ b/browser/extensions/formautofill/test/browser/browser_dynamic_form_autocompletion.js @@ -335,3 +335,174 @@ add_task( ); } ); + +/** + * Test that a select field is not filled on form change if the previously matching option is not present anymore. + */ +add_task( + async function select_field_cleared_on_form_change_when_no_matching_value_in_updated_select_options() { + const stateValueAfterFormChange = await BrowserTestUtils.withNewTab( + ADDRESS_FORM_URL, + async browser => { + const selectorToTriggerAutocompletion = "#organization"; + const elementValueToVerifyAutofill = TEST_ADDRESS_1.organization; + + // Setting up an address-level1 element + for (const opt of nonMatchingProvinces) { + const option = content.document.createElement("option"); + option.value = opt.value; + option.textContent = opt.text; + stateSelect.appendChild(option); + } + }); + + info("Waiting for filling on form change"); + await filledOnFormChangePromise; + + return await SpecialPowers.spawn(browser, [], async () => { + const stateSelect = content.document.getElementById("address-level1"); + + info("Checking that select element lost highlighting"); + await ContentTaskUtils.waitForCondition( + () => !stateSelect.matches(":autofill"), + `Checking #${stateSelect.id} is not highlighted` + ); + + return stateSelect.value; + }); + } + ); + Assert.equal( + stateValueAfterFormChange, + "", + "State field without matching option is cleared after form change" + ); + } +); + +/** + * Test that a previously unfilled select field is filled on form change if a matching option is present in the changed select options. + */ +add_task( + async function not_autofilled_select_field_filled_on_form_change_when_matching_value_in_updated_select_options() { + const stateValueAfterFormChange = await BrowserTestUtils.withNewTab( + ADDRESS_FORM_URL, + async browser => { + const selectorToTriggerAutocompletion = "#organization"; + const elementValueToVerifyAutofill = TEST_ADDRESS_1.organization; + + // Setting up an address-level1 ` -); -// This fourth page asserts responses with line breaks -const FETCH_CONTENT_4 = addBaseHtmlElements(` +const TEST_PAGES = { + // This page asserts we can redirect to another URL, even if JS happen to be executed + redirect: addBaseHtmlElements( + `Fetch 1` + ), + + // #1 This page asserts that JS is disabled + js: addBaseHtmlElements( + `Fetch 2` + ), + + // #2 This page asserts that links and forms are disabled + forms: addBaseHtmlElements( + `Fetch 3link --
` + ), + + // #3 This page asserts responses with line breaks work + lineBreak: addBaseHtmlElements(` link1 link2 -`); -// This fifth page asserts that we apply inline styles -const FETCH_CONTENT_5 = addBaseHtmlElements(` -

Hello World

-`); + `), + + // #4 This page asserts that we apply inline styles + styles: addBaseHtmlElements(`

Hello World

`), + + // #5 This page asserts that (multiple) Content-Security-Policy headers are applied + csp: addBaseHtmlElements(` + + + + + `), +}; // Use fetch in order to prevent actually running this code in the test page -const TEST_HTML = addBaseHtmlElements(`
HTML
`); +const TEST_HTML = addBaseHtmlElements( + `
HTML
` +); const TEST_URL = BASE_URL + "doc-html-preview.html"; httpServer.registerPathHandler( @@ -59,26 +71,21 @@ httpServer.registerPathHandler( response.write(TEST_HTML); } ); -httpServer.registerPathHandler("/fetch-1.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_1); -}); -httpServer.registerPathHandler("/fetch-2.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_2); -}); -httpServer.registerPathHandler("/fetch-3.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_3); -}); -httpServer.registerPathHandler("/fetch-4.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_4); -}); -httpServer.registerPathHandler("/fetch-5.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_5); -}); + +for (const [name, content] of Object.entries(TEST_PAGES)) { + httpServer.registerPathHandler(`/fetch-${name}.html`, (request, response) => { + response.setStatusLine(request.httpVersion, 200, "OK"); + + if (name === "csp") { + // Duplicate un-merged headers + response.setHeaderNoCheck("Content-Security-Policy", "img-src 'none'"); + response.setHeaderNoCheck("Content-Security-Policy", "base-uri 'self'"); + } + + response.write(content); + }); +} + httpServer.registerPathHandler("/redirect.html", (request, response) => { response.setStatusLine(request.httpVersion, 200, "OK"); response.write("Redirected!"); @@ -97,26 +104,33 @@ add_task(async function () { store.dispatch(Actions.batchEnable(false)); - const onNetworkEvent = waitForNetworkEvents(monitor, 3); + const onNetworkEvent = waitForNetworkEvents( + monitor, + 1 + Object.keys(TEST_PAGES).length + ); await reloadBrowser(); await onNetworkEvent; // The new lines are stripped when using outerHTML to retrieve HTML content of the preview iframe - await selectIndexAndWaitForHtmlView(0, TEST_HTML); - await selectIndexAndWaitForHtmlView(1, FETCH_CONTENT_1); - await selectIndexAndWaitForHtmlView(2, FETCH_CONTENT_2); - await selectIndexAndWaitForHtmlView(3, FETCH_CONTENT_3); - await selectIndexAndWaitForHtmlView(4, FETCH_CONTENT_4); - await selectIndexAndWaitForHtmlView(5, FETCH_CONTENT_5); + await selectIndexAndWaitForHtmlView(0, "initial-page", TEST_HTML); + let index = 1; + for (const [name, content] of Object.entries(TEST_PAGES)) { + await selectIndexAndWaitForHtmlView(index, name, content); + index++; + } await teardown(monitor); - async function selectIndexAndWaitForHtmlView(index, expectedHtmlPreview) { - info(`Select the request #${index}`); + async function selectIndexAndWaitForHtmlView( + index_, + name, + expectedHtmlPreview + ) { + info(`Select the request "${name}" #${index_}`); const onResponseContent = monitor.panelWin.api.once( TEST_EVENTS.RECEIVED_RESPONSE_CONTENT ); - store.dispatch(Actions.selectRequestByIndex(index)); + store.dispatch(Actions.selectRequestByIndex(index_)); document.querySelector("#response-tab").click(); @@ -148,7 +162,7 @@ add_task(async function () { } ); - if (expectedHtmlPreview == FETCH_CONTENT_5) { + if (name === "style") { await SpecialPowers.spawn(browser.browsingContext, [], async function () { const p = content.document.querySelector("p"); const computed = content.window.getComputedStyle(p); @@ -160,8 +174,23 @@ add_task(async function () { }); } + if (name == "csp") { + await SpecialPowers.spawn(browser.browsingContext, [], async function () { + is( + content.document.querySelector("img").complete, + false, + "img was blocked" + ); + is( + content.document.querySelector("iframe").src, + "/foo.html", + "URL of iframe was not changed by " + ); + }); + } + // Only assert copy to clipboard on the first test page - if (expectedHtmlPreview == TEST_HTML) { + if (name == "initial-page") { await waitForClipboardPromise(async function () { await SpecialPowers.spawn( browser.browsingContext, diff --git a/devtools/client/performance-new/@types/gecko.d.ts b/devtools/client/performance-new/@types/gecko.d.ts index 7d4a3d8544c..86795044c1e 100644 --- a/devtools/client/performance-new/@types/gecko.d.ts +++ b/devtools/client/performance-new/@types/gecko.d.ts @@ -232,19 +232,21 @@ declare namespace MockedExports { interface FaviconData { uri: nsIURI; - dataLen: number; - data: number[]; + rawData: number[]; mimeType: string; - size: number; + width: number; } const PlaceUtilsSYSMJS: { PlacesUtils: { - promiseFaviconData: ( - pageUrl: string | URL | nsIURI, - preferredWidth?: number - ) => Promise; - // TS-TODO: Add the rest. + favicons: { + getFaviconForPage: ( + pageUrl: nsIURI, + preferredWidth?: number + ) => Promise; + // TS-TODO: Add the rest. + }, + toURI: (uri: string | URL | nsIURI) => nsIURI; }; }; diff --git a/devtools/client/performance-new/shared/background.sys.mjs b/devtools/client/performance-new/shared/background.sys.mjs index 0f53908a51b..e3ac68f3681 100644 --- a/devtools/client/performance-new/shared/background.sys.mjs +++ b/devtools/client/performance-new/shared/background.sys.mjs @@ -460,17 +460,18 @@ async function getPageFavicons(pageUrls) { } // Get the data of favicons and return them. - const { promiseFaviconData } = lazy.PlacesUtils(); + const { favicons, toURI } = lazy.PlacesUtils(); const promises = pageUrls.map(pageUrl => - promiseFaviconData(pageUrl, /* preferredWidth = */ 32) + favicons + .getFaviconForPage(toURI(pageUrl), /* preferredWidth = */ 32) .then(favicon => { // Check if data is found in the database and return it if so. - if (favicon.dataLen > 0 && favicon.data) { + if (favicon.rawData.length) { return { // PlacesUtils returns a number array for the data. Converting it to // the Uint8Array here to send it to the tab more efficiently. - data: new Uint8Array(favicon.data).buffer, + data: new Uint8Array(favicon.rawData).buffer, mimeType: favicon.mimeType, }; } diff --git a/devtools/client/shared/curl.js b/devtools/client/shared/curl.js index cd8af64f86a..5f30c411583 100644 --- a/devtools/client/shared/curl.js +++ b/devtools/client/shared/curl.js @@ -58,17 +58,11 @@ const Curl = { generateCommand(data, platform) { const utils = CurlUtils; - let command = ["curl"]; + let commandParts = []; // Make sure to use the following helpers to sanitize arguments before execution. - const addParam = value => { - const safe = /^[a-zA-Z-]+$/.test(value) ? value : escapeString(value); - command.push(safe); - }; - - const addPostData = value => { - const safe = /^[a-zA-Z-]+$/.test(value) ? value : escapeString(value); - postData.push(safe); + const escapeStringifNeeded = value => { + return /^[a-zA-Z-]+$/.test(value) ? value : escapeString(value); }; const ignoredHeaders = new Set(); @@ -77,17 +71,17 @@ const Curl = { // The cURL command is expected to run on the same platform that Firefox runs // (it may be different from the inspected page platform). const escapeString = - currentPlatform == "WINNT" + currentPlatform === "WINNT" ? utils.escapeStringWin : utils.escapeStringPosix; // Add URL. - addParam(data.url); + commandParts.push(escapeString(data.url)); // Disable globbing if the URL contains brackets. // cURL also globs braces but they are already percent-encoded. if (data.url.includes("[") || data.url.includes("]")) { - addParam("--globoff"); + commandParts.push("--globoff"); } let postDataText = null; @@ -104,13 +98,13 @@ const Curl = { // which composed using \n only, not \r\n, may be not parsable for // peers which split parts of multipart payload using \r\n. postDataText = data.postDataText; - addPostData("--data-binary"); + postData.push("--data-binary"); const boundary = utils.getMultipartBoundary(data); const text = utils.removeBinaryDataFromMultipartText( postDataText, boundary ); - addPostData(text); + postData.push(escapeStringifNeeded(text)); ignoredHeaders.add("content-length"); } else if ( data.postDataText && @@ -119,8 +113,10 @@ const Curl = { ) { // When no postData exists, --data-raw should not be set postDataText = data.postDataText; - addPostData("--data-raw"); - addPostData(utils.writePostDataTextParams(postDataText)); + postData.push( + "--data-raw " + + escapeStringifNeeded(`${utils.writePostDataTextParams(postDataText)}`) + ); ignoredHeaders.add("content-length"); } // curl generates the host header itself based on the given URL @@ -128,20 +124,19 @@ const Curl = { // Add --compressed if the response is compressed if (utils.isContentEncodedResponse(data)) { - addParam("--compressed"); + commandParts.push("--compressed"); } // Add -I (HEAD) // For servers that supports HEAD. // This will fetch the header of a document only. if (data.method === "HEAD") { - addParam("-I"); + commandParts.push("-I"); } else if (data.method !== "GET") { // Add method. // For HEAD and GET requests this is not necessary. GET is the // default, -I implies HEAD. - addParam("-X"); - addParam(data.method); + commandParts.push("-X " + escapeStringifNeeded(`${data.method}`)); } // Add request headers. @@ -155,14 +150,26 @@ const Curl = { if (ignoredHeaders.has(header.name.toLowerCase())) { continue; } - addParam("-H"); - addParam(header.name + ": " + header.value); + commandParts.push( + "-H " + escapeStringifNeeded(`${header.name}: ${header.value}`) + ); } // Add post data. - command = command.concat(postData); + commandParts = commandParts.concat(postData); - return command.join(" "); + // Format with line breaks if the command has more than 2 parts + // e.g + // Command with 2 parts - curl https://foo.com + // Commands with more than 2 parts - + // curl https://foo.com + // -X POST + // -H "Accept : */*" + // -H "accept-language: en-US" + const joinStr = currentPlatform === "WINNT" ? " ^\n " : " \\\n "; + return ( + "curl " + commandParts.join(commandParts.length >= 3 ? joinStr : " ") + ); }, }; @@ -444,18 +451,16 @@ const CurlUtils = { same escape characters, they can interact with each other in horrible ways, the order of operations is critical. */ - const encapsChars = '"'; + const encapsChars = '^"'; return ( encapsChars + str - // Replace \ with \\ first because it is an escape character for certain // conditions in both parsers. .replace(/\\/g, "\\\\") - // Replace double quote chars with two double quotes (not by escaping with \") because it is - // recognized by both cmd.exe and MS Crt arguments parser. - .replace(/"/g, '""') + // Escape double quotes with double slashes. + .replace(/"/g, '\\"') // Escape ` and $ so commands do not get executed e.g $(calc.exe) or `\$(calc.exe) .replace(/[`$]/g, "\\$&") @@ -473,15 +478,10 @@ const CurlUtils = { // by the previous replace. .replace(/%(?=[a-zA-Z0-9_])/g, "%^") - // We replace \r and \r\n with \n, this allows to consistently escape all new - // lines in the next replace - .replace(/\r\n?/g, "\n") - // Lastly we replace new lines with ^ and TWO new lines because the first // new line is there to enact the escape command the second is the character // to escape (in this case new line). - // The extra " enables escaping new lines with ^ within quotes in cmd.exe. - .replace(/\n/g, '"^\r\n\r\n"') + + .replace(/\r?\n/g, "^\n\n") + encapsChars ); }, diff --git a/devtools/client/shared/test/xpcshell/test_curl.js b/devtools/client/shared/test/xpcshell/test_curl.js index a2a6c3412ee..7b1f0f93348 100644 --- a/devtools/client/shared/test/xpcshell/test_curl.js +++ b/devtools/client/shared/test/xpcshell/test_curl.js @@ -231,9 +231,10 @@ add_task(async function () { // Check binary data const dataBinaryPos = cmd.indexOf("--data-binary"); - const dataBinaryParam = `--data-binary ${isWin() ? "" : "$"}${escapeNewline( + const dataBinaryParam = `--data-binary ${isWin() ? "^\n " : "\\\n $"}${escapeNewline( quote(request.postDataText) )}`; + Assert.notStrictEqual( dataBinaryPos, -1, @@ -340,13 +341,15 @@ function isWin() { return Services.appinfo.OS === "WINNT"; } -const QUOTE = isWin() ? '"' : "'"; +const QUOTE = isWin() ? '^"' : "'"; // Quote a string, escape the quotes inside the string function quote(str) { let escaped; if (isWin()) { - escaped = str.replace(new RegExp(QUOTE, "g"), `${QUOTE}${QUOTE}`); + escaped = str + .replace(new RegExp(QUOTE, "g"), `${QUOTE}${QUOTE}`) + .replace(/"/g, '\\"'); } else { escaped = str.replace(new RegExp(QUOTE, "g"), `\\${QUOTE}`); } @@ -355,8 +358,10 @@ function quote(str) { function escapeNewline(txt) { if (isWin()) { - // Add `"` to close quote, then escape newline outside of quote, then start new quote - return txt.replace(/[\r\n]{1,2}/g, '"^$&$&"'); + // Replace new lines with ^ and TWO new lines because the first + // new line is there to enact the escape command the second is the character + // to escape (in this case new line). + return txt.replace(/\r?\n/g, "^\n\n"); } return txt.replace(/\r/g, "\\r").replace(/\n/g, "\\n"); } @@ -392,6 +397,6 @@ function parseCurl(curlCmd) { // This monster regexp parses the command line into an array of arguments, // recognizing quoted args with matching quotes and escaped quotes inside: // [ "curl 'url'", "--standalone-arg", "-arg-with-quoted-string 'value\'s'" ] - const matchRe = /[-A-Za-z1-9]+(?: \$?([\"'])(?:\\\1|.)*?\1)?/g; + const matchRe = /[-A-Za-z1-9]+(?: ([\^\\"']+)(?:\\\1|.)*?\1)?/g; return curlCmd.match(matchRe); } diff --git a/devtools/client/shared/thread-utils.js b/devtools/client/shared/thread-utils.js index 7f3aa4a8ac5..59698e10b04 100644 --- a/devtools/client/shared/thread-utils.js +++ b/devtools/client/shared/thread-utils.js @@ -15,6 +15,7 @@ const asyncStore = asyncStoreHelper("debugger", { xhrBreakpoints: ["xhr-breakpoints", []], eventListenerBreakpoints: ["event-listener-breakpoints", undefined], blackboxedRanges: ["blackboxedRanges", {}], + directoryRoots: ["directory-roots", {}], }); exports.asyncStore = asyncStore; diff --git a/devtools/server/actors/descriptors/tab.js b/devtools/server/actors/descriptors/tab.js index b7954d13099..9d9d18c28d3 100644 --- a/devtools/server/actors/descriptors/tab.js +++ b/devtools/server/actors/descriptors/tab.js @@ -221,10 +221,10 @@ class TabDescriptorActor extends Actor { } try { - const { data } = await lazy.PlacesUtils.promiseFaviconData( - this._getUrl() + const favicon = await lazy.PlacesUtils.favicons.getFaviconForPage( + lazy.PlacesUtils.toURI(this._getUrl()) ); - return data; + return favicon.rawData; } catch (e) { // Favicon unavailable for this url. return null; diff --git a/devtools/server/actors/page-style.js b/devtools/server/actors/page-style.js index f22454483d3..5dd24062eb9 100644 --- a/devtools/server/actors/page-style.js +++ b/devtools/server/actors/page-style.js @@ -421,7 +421,8 @@ class PageStyleActor extends Actor { const opts = { previewText: options.previewText, previewFontSize: options.previewFontSize, - fontStyle: weight + " " + style, + fontStyle: style, + fontWeight: weight, fillStyle: options.previewFillStyle, }; const { dataURL, size } = getFontPreviewData( diff --git a/devtools/server/actors/utils/style-utils.js b/devtools/server/actors/utils/style-utils.js index 9d33353600c..8488ccd155f 100644 --- a/devtools/server/actors/utils/style-utils.js +++ b/devtools/server/actors/utils/style-utils.js @@ -8,6 +8,7 @@ const XHTML_NS = "http://www.w3.org/1999/xhtml"; const FONT_PREVIEW_TEXT = "Abc"; const FONT_PREVIEW_FONT_SIZE = 40; const FONT_PREVIEW_FILLSTYLE = "black"; +const FONT_PREVIEW_FONT_FALLBACK = "serif"; // Offset (in px) to avoid cutting off text edges of italic fonts. const FONT_PREVIEW_OFFSET = 4; // Factor used to resize the canvas in order to get better text quality. @@ -36,6 +37,7 @@ function getFontPreviewData(font, doc, options) { const previewFontSize = options.previewFontSize || FONT_PREVIEW_FONT_SIZE; const fillStyle = options.fillStyle || FONT_PREVIEW_FILLSTYLE; const fontStyle = options.fontStyle || ""; + const fontWeight = options.fontWeight || ""; const canvas = doc.createElementNS(XHTML_NS, "canvas"); const ctx = canvas.getContext("2d"); @@ -59,7 +61,24 @@ function getFontPreviewData(font, doc, options) { } fontParts.push(f); } - const fontValue = `${fontStyle} ${previewFontSize}px ${fontParts.join(", ")}, serif`; + // Add a fallback value + fontParts.push(FONT_PREVIEW_FONT_FALLBACK); + + // Apply individual font properties to the canvas element so we can easily compute the + // canvas context font + // First, we need to start with a default shorthand to make it work + canvas.style.font = `${FONT_PREVIEW_FONT_SIZE}px ${FONT_PREVIEW_FONT_FALLBACK}`; + // Then we can set the different properties + canvas.style.fontFamily = fontParts.join(", "); + canvas.style.fontSize = `${previewFontSize}px`; + if (fontWeight) { + canvas.style.fontWeight = fontWeight; + } + if (fontStyle) { + canvas.style.fontStyle = fontStyle; + } + + const fontValue = canvas.style.font; // Get the correct preview text measurements and set the canvas dimensions ctx.font = fontValue; diff --git a/devtools/server/tests/browser/browser_style_utils_getFontPreviewData.js b/devtools/server/tests/browser/browser_style_utils_getFontPreviewData.js index e05b8cf5310..6b70a96acc6 100644 --- a/devtools/server/tests/browser/browser_style_utils_getFontPreviewData.js +++ b/devtools/server/tests/browser/browser_style_utils_getFontPreviewData.js @@ -176,5 +176,23 @@ add_task(async function () { `40px "Menlo Bold", "Fira Code", "Mono Lisa", monospace, serif`, "Expected font style was used in the canvas" ); + + // Check font-weight value + is( + getFontPreviewData(`monospace`, content.document, { fontWeight: "200" }) + .ctx.font, + `200 40px monospace, serif`, + "Expected font style was used in the canvas" + ); + + // Check font-style value + is( + getFontPreviewData(`monospace`, content.document, { + fontWeight: "200", + fontStyle: "italic", + }).ctx.font, + `italic 200 40px monospace, serif`, + "Expected font style was used in the canvas" + ); }); }); diff --git a/devtools/shared/compatibility/dataset/css-properties.json b/devtools/shared/compatibility/dataset/css-properties.json index eb8b638458c..4d24704dba7 100644 --- a/devtools/shared/compatibility/dataset/css-properties.json +++ b/devtools/shared/compatibility/dataset/css-properties.json @@ -1 +1 @@ -{"-moz-float-edge":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-force-broken-image-icon":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-image-region":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-image-region","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"111","added":1,"removed":112}],"firefox_android":[{"version_last":"111","added":4,"removed":112}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-orient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-orient","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"inline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"-moz-user-focus":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"121","added":1,"removed":122}],"firefox_android":[{"version_last":"121","added":4,"removed":122}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-user-input":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-user-input","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"auto":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"none":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"-webkit-app-region":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-webkit-border-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-border-horizontal-spacing":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-border-vertical-spacing":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-box-reflect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-axis":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"34","added":17,"removed":35}],"chrome_android":[{"version_last":"34","added":18,"removed":35}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-column-break-after":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-break-before":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-break-inside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-progression":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"34","added":22,"removed":35}],"chrome_android":[{"version_last":"34","added":25,"removed":35}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-cursor-visibility":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-hyphenate-limit-after":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":11,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-hyphenate-limit-before":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":11,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-hyphenate-limit-lines":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":16,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-align":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":19,"removed":34}],"chrome_android":[{"version_last":"33","added":25,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-box-contain":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"46","added":12,"removed":47}],"chrome_android":[{"version_last":"46","added":18,"removed":47}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-line-grid":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":17,"removed":34}],"chrome_android":[{"version_last":"33","added":18,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-snap":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":19,"removed":34}],"chrome_android":[{"version_last":"33","added":25,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-locale":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-logical-height":{"_aliasOf":"block-size"},"-webkit-logical-width":{"_aliasOf":"inline-size"},"-webkit-margin-after":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-margin-before":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-mask-box-image":{"_aliasOf":"mask-border"},"-webkit-mask-composite":{"_aliasOf":"mask-composite"},"-webkit-mask-position-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]}}},"-webkit-mask-position-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]}}},"-webkit-mask-repeat-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"119","added":3,"removed":120}],"chrome_android":[{"version_last":"119","added":18,"removed":120}],"edge":[{"version_last":"119","added":79,"removed":120}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"14.1","added":5,"removed":15}],"safari_ios":[{"version_last":"14.5","added":5,"removed":15}]}}},"-webkit-mask-repeat-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"119","added":3,"removed":120}],"chrome_android":[{"version_last":"119","added":18,"removed":120}],"edge":[{"version_last":"119","added":79,"removed":120}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"14.1","added":5,"removed":15}],"safari_ios":[{"version_last":"14.5","added":5,"removed":15}]}}},"-webkit-mask-source-type":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-max-logical-height":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-max-logical-width":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-min-logical-height":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-min-logical-width":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-nbsp-mode":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"27","added":1,"removed":28}],"chrome_android":[{"version_last":"27","added":18,"removed":28}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-perspective-origin-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-perspective-origin-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-rtl-ordering":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-tap-highlight-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":4}]}}},"-webkit-text-combine":{"_aliasOf":"text-combine-upright"},"-webkit-text-decorations-in-effect":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"13","added":4,"removed":13.1}],"safari_ios":[{"version_last":"13","added":3.2,"removed":13.4}]}}},"-webkit-text-fill-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-fill-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-security":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-security","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":114}],"firefox_android":[{"added":114}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]}}},"-webkit-text-stroke":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-stroke-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-stroke-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-zoom":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]}}},"-webkit-touch-callout":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":2}]}}},"-webkit-transform-origin-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-transform-origin-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-transform-origin-z":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-user-drag":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"accent-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/accent-color","spec_url":"https://drafts.csswg.org/css-ui/#widget-accent","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":15.4}],"safari_ios":[{"partial_implementation":true,"added":15.4}]},"tags":["web-features:accent-color"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:accent-color"]}}},"align-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-content","spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#align-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":28},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":28},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"block_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#align-justify-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:align-content-block"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#align-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/41344054","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/41344054","added":false}],"edge":[{"impl_url":"https://crbug.com/41344054","added":false}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":11}],"safari_ios":[{"partial_implementation":true,"added":11}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"space-evenly":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.6}],"safari_ios":[{"added":15.6}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-grid/#grid-align"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-multicol/#the-multi-column-model"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:multi-column"]}},"_aliasOf":"align-content"},"align-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-items","spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52},{"partial_implementation":true,"version_last":"51","added":21,"removed":52}],"chrome_android":[{"added":52},{"partial_implementation":true,"version_last":"51","added":25,"removed":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":108}],"chrome_android":[{"added":108}],"edge":[{"added":108}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"_aliasOf":"align-items"},"align-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-self","spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"partial_implementation":true,"version_last":"35","added":21,"removed":36}],"chrome_android":[{"added":36},{"partial_implementation":true,"version_last":"35","added":25,"removed":36}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":108}],"chrome_android":[{"added":108}],"edge":[{"added":108}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#align-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}},"_aliasOf":"align-self","-ms-grid_context":{"_aliasOf":"grid_context"}},"alignment-baseline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/alignment-baseline","spec_url":["https://drafts.csswg.org/css-inline/#alignment-baseline-property","https://svgwg.org/svg2-draft/text.html#AlignmentBaselineProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]},"alphabetic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:alignment-baseline"]}},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"central":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"ideographic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"mathematical":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"middle":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}}},"all":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/all","spec_url":"https://drafts.csswg.org/css-cascade/#all-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":27}],"firefox_android":[{"added":27}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:all"]}},"alt":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"17.6","added":9,"removed":18},{"prefix":"-webkit-","version_last":"17.6","added":8,"removed":18}],"safari_ios":[{"version_last":"17.6","added":9,"removed":18},{"prefix":"-webkit-","version_last":"17.6","added":8,"removed":18}]}},"_aliasOf":"alt"},"anchor-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/anchor-name","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-name-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"anchor-scope":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#propdef-anchor-scope","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-scope-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-scope-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"animation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation","spec_url":"https://drafts.csswg.org/css-animations/#animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"animation-timeline_included":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":115}],"chrome_android":[{"partial_implementation":true,"added":115}],"edge":[{"partial_implementation":true,"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-driven-animations"]}},"_aliasOf":"animation"},"animation-composition":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-composition","spec_url":"https://drafts.csswg.org/css-animations-2/#animation-composition","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:animation-composition"]}},"animation-delay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-delay","spec_url":"https://drafts.csswg.org/css-animations/#animation-delay","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"_aliasOf":"animation-delay"},"animation-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-direction","spec_url":"https://drafts.csswg.org/css-animations/#animation-direction","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"alternate":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-alternate","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"alternate-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-alternate-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:animations-css"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-direction"},"animation-duration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-duration","spec_url":"https://drafts.csswg.org/css-animations/#animation-duration","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"partial_implementation":true,"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:animations-css"]},"auto":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-duration#Values","spec_url":"https://drafts.csswg.org/css-animations-2/#valdef-animation-duration-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-duration"},"animation-fill-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode","spec_url":"https://drafts.csswg.org/css-animations/#animation-fill-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":5}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":4}]},"tags":["web-features:animations-css"]},"backwards":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-backwards","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"forwards":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-forwards","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-fill-mode"},"animation-iteration-count":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count","spec_url":"https://drafts.csswg.org/css-animations/#animation-iteration-count","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"infinite":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-iteration-count-infinite","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-iteration-count"},"animation-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-name","spec_url":"https://drafts.csswg.org/css-animations/#animation-name","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-name"},"animation-play-state":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-play-state","spec_url":"https://drafts.csswg.org/css-animations/#animation-play-state","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:animations-css"]},"paused":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-play-state-paused","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"running":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-play-state-running","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-play-state"},"animation-range":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"animation-range-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range-end","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-animation-range-end-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-range-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range-start","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-animation-range-start-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline","spec_url":"https://drafts.csswg.org/css-animations-2/#animation-timeline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":110}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"scroll":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline/scroll","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":110}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline/view","spec_url":"https://drafts.csswg.org/scroll-animations/#view-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-timing-function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timing-function","spec_url":["https://drafts.csswg.org/css-animations/#animation-timing-function","https://drafts.csswg.org/css-easing/#linear-easing-function-parsin"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"jump":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":14}],"safari_ios":[{"added":14}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-timing-function"},"appearance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/appearance","spec_url":"https://drafts.csswg.org/css-ui/#appearance-switching","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":84},{"prefix":"-webkit-","added":18}],"edge":[{"added":84},{"prefix":"-webkit-","added":12}],"firefox":[{"added":80},{"prefix":"-webkit-","added":64},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":80},{"prefix":"-webkit-","added":64},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":1}]},"tags":["web-features:appearance"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":80}],"firefox_android":[{"added":80}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:appearance"]}},"base":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-base","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"base-select","added":134}],"chrome_android":[{"alternative_name":"base-select","added":134}],"edge":[{"alternative_name":"base-select","added":134}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:appearance"]},"_aliasOf":"base"},"button":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-button","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"checkbox":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-checkbox","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"listbox":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-listbox","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"menulist":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-menulist","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"menulist-button":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-menulist-button","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":80},{"partial_implementation":true,"added":1}],"firefox_android":[{"added":80},{"partial_implementation":true,"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:appearance"]}},"meter":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-meter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":54},{"partial_implementation":true,"added":1}],"firefox_android":[{"added":54},{"partial_implementation":true,"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":3}]},"tags":["web-features:appearance"]}},"progress-bar":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-progress-bar","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"radio":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-radio","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"searchfield":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-searchfield","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"textarea":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-textarea","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"textfield":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-textfield","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:appearance"]}},"_aliasOf":"appearance","base-select":{"_aliasOf":"base"}},"aspect-ratio":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/aspect-ratio","spec_url":"https://drafts.csswg.org/css-sizing-4/#aspect-ratio","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":89}],"firefox_android":[{"added":89}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:aspect-ratio"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-aspect-ratio-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":89}],"firefox_android":[{"added":89}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:aspect-ratio"]}}},"backdrop-filter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/backdrop-filter","spec_url":"https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":76}],"chrome_android":[{"added":76}],"edge":[{"added":79},{"prefix":"-webkit-","version_last":"18","added":17,"removed":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":18},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":18},{"prefix":"-webkit-","added":9}]},"tags":["web-features:backdrop-filter"]},"_aliasOf":"backdrop-filter"},"backface-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/backface-visibility","spec_url":"https://drafts.csswg.org/css-transforms-2/#backface-visibility-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":5}]},"tags":["web-features:transforms3d"]},"_aliasOf":"backface-visibility"},"background":{"SVG_image_as_background":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3.1}],"safari_ios":[{"added":1}]},"tags":["web-features:svg"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background"]},"background-clip":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-clip"]}},"background-origin":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-origin"]}},"background-size":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":9}],"firefox_android":[{"added":18}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-size"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background"]}}},"background-attachment":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-attachment","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-attachment","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-fixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":2}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":14,"removed":15.4},{"version_last":"13.1","added":3.1,"removed":14}],"safari_ios":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":5,"removed":15.4}]},"tags":["web-features:background-attachment"]}},"local":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-local","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":25}],"firefox_android":[{"added":25}],"ie":[{"added":9}],"safari":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":13,"removed":15.4},{"version_last":"12.1","added":5,"removed":13}],"safari_ios":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":13,"removed":15.4},{"version_last":"12.2","added":4.2,"removed":13}]},"tags":["web-features:background-attachment"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]}}},"background-blend-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-blend-mode","spec_url":"https://drafts.fxtf.org/compositing/#background-blend-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":35}],"chrome_android":[{"added":35}],"edge":[{"added":79}],"firefox":[{"added":30}],"firefox_android":[{"added":30}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-blend-mode"]}},"background-clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-clip","spec_url":["https://drafts.csswg.org/css-backgrounds/#background-clip","https://drafts.csswg.org/css-backgrounds-4/#background-clip"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"partial_implementation":true,"prefix":"-moz-","version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":5},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-clip"]},"border-area":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-4/#valdef-background-clip-border-area","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:background-clip-border-area"]}},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-clip"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-clip"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-clip"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-4/#valdef-background-clip-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"partial_implementation":true,"added":3}],"chrome_android":[{"added":120},{"partial_implementation":true,"added":18}],"edge":[{"added":120},{"partial_implementation":true,"added":79},{"version_last":"18","added":15,"removed":79},{"partial_implementation":true,"version_last":"14","added":12,"removed":15}],"firefox":[{"partial_implementation":true,"added":49}],"firefox_android":[{"partial_implementation":true,"added":49}],"ie":[{"added":false}],"safari":[{"added":14},{"partial_implementation":true,"added":4}],"safari_ios":[{"added":14},{"partial_implementation":true,"added":3.2}]},"tags":["web-features:background-clip-text"]}},"_aliasOf":"background-clip"},"background-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-color"]}},"background-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-image","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]},"element":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/element","spec_url":"https://drafts.csswg.org/css-images-4/#element-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"prefix":"-moz-","added":4}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:element"]},"_aliasOf":"element"},"gradients":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images-4/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:gradients"]}},"image-rect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-image-rect","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"prefix":"-moz-","version_last":"119","added":4,"removed":120}],"firefox_android":[{"prefix":"-moz-","version_last":"119","added":4,"removed":120}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"_aliasOf":"image-rect"},"image-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image/image-set","spec_url":"https://drafts.csswg.org/css-images-4/#image-set-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":20,"removed":113}],"chrome_android":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":25,"removed":113}],"edge":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":79,"removed":113}],"firefox":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"firefox_android":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.1","added":10.1,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.1","added":6,"removed":14}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.4","added":10.3,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.4","added":6,"removed":14}]},"tags":["web-features:image-set"]},"_aliasOf":"image-set"},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-image-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]}},"svg_images":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}},"-moz-element":{"_aliasOf":"element"},"-moz-image-rect":{"_aliasOf":"image-rect"},"-webkit-image-set":{"_aliasOf":"image-set"}},"background-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-origin","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-origin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"partial_implementation":true,"prefix":"-moz-","version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":3},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":1},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-origin"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-origin"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-origin"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-origin"]}},"_aliasOf":"background-origin"},"background-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":9}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:background-position"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}}},"background-position-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position-x","spec_url":"https://drafts.csswg.org/css-backgrounds-4/#background-position-longhands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:background-position"]}}},"background-position-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position-y","spec_url":"https://drafts.csswg.org/css-backgrounds-4/#background-position-longhands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:background-position"]}}},"background-repeat":{"2-value":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4}]},"tags":["web-features:background-repeat"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-repeat","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"no-repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-no-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat-x":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat-x","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat-y":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat-y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"round":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-repeat"]}},"space":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-space","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-repeat"]}}},"background-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-size","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"3.6","added":3.6,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-size"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-size"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:background-size"]}},"cover":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-cover","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:background-size"]}},"_aliasOf":"background-size"},"baseline-shift":{"__compat":{"spec_url":["https://drafts.csswg.org/css-inline/#baseline-shift-property","https://svgwg.org/svg2-draft/text.html#BaselineShiftProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:baseline-shift"]},"baseline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-baseline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:baseline-shift"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:baseline-shift"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:baseline-shift"]}}},"baseline-source":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#baseline-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}},"first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-first","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}},"last":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-last","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}}},"block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/block-size","spec_url":["https://drafts.csswg.org/css-logical/#dimension-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57},{"alternative_name":"-webkit-logical-height","added":8}],"chrome_android":[{"added":57},{"alternative_name":"-webkit-logical-height","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-logical-height","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-logical-height","added":5.1}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-logical-height","added":5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"block-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"border":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border","spec_url":"https://drafts.csswg.org/css-backgrounds/#propdef-border","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-color","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-style","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-width","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-left-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomleft","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomleft","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-bottom-left-radius"},"border-bottom-right-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomright","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomright","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-bottom-right-radius"},"border-bottom-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-collapse":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-collapse","spec_url":"https://drafts.csswg.org/css2/#propdef-border-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1.2}],"safari_ios":[{"added":3}]},"tags":["web-features:table"]},"collapse":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:table"]}},"separate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:table"]}}},"border-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-color","spec_url":["https://drafts.csswg.org/css-logical/#logical-shorthand-keyword","https://drafts.csswg.org/css-backgrounds/#border-color"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-end-end-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-end-start-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16},{"prefix":"-webkit-","added":7}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":15},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":15},{"prefix":"-moz-","added":4}],"ie":[{"added":11}],"safari":[{"added":6},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":6},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:border-image"]},"fill":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"gradient":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":7}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":29}],"firefox_android":[{"added":29}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:border-image"]}},"optional_border_image_slice":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"_aliasOf":"border-image"},"border-image-outset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-outset","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"border-image-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-repeat","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]},"repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"round":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"space":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-space","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":12}],"firefox":[{"added":50}],"firefox_android":[{"added":50}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}}},"border-image-slice":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-slice","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]},"_aliasOf":"border-image-slice"},"border-image-source":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-source","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"border-image-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-width-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}}},"border-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-color","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-end-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-color","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-color","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-color"},"border-inline-end-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-style","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-style","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-style"},"border-inline-end-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-width","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-width","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-width"},"border-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-start-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-start-color","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-start-color","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-start-color"},"border-inline-start-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-start-style","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-start-style","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-start-style"},"border-inline-start-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-style","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-width","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-radius":{"4_values_for_4_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-moz-","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-moz-","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_borders":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-radius"},"border-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-spacing","spec_url":"https://drafts.csswg.org/css2/#separated-borders","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"border-start-end-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-start-start-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]},"dashed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-dashed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"dotted":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-dotted","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"double":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-double","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"groove":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-groove","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"inset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-inset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"outset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"ridge":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-ridge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"solid":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-solid","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}}},"border-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-left-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topleft","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topleft","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-top-left-radius"},"border-top-right-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topright","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topright","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-top-right-radius"},"border-top-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3}]},"tags":["web-features:borders"]}},"bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/bottom","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"box-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-align","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-align"},"box-decoration-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-decoration-break","spec_url":"https://drafts.csswg.org/css-break/#break-decoration","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":25}],"edge":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"prefix":"-webkit-","added":7}],"safari_ios":[{"partial_implementation":true,"prefix":"-webkit-","added":7}]},"tags":["web-features:box-decoration-break"]},"clone":{"__compat":{"spec_url":"https://drafts.csswg.org/css-break/#valdef-box-decoration-break-clone","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"added":25}],"edge":[{"added":130},{"partial_implementation":true,"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:box-decoration-break"]}},"slice":{"__compat":{"spec_url":"https://drafts.csswg.org/css-break/#valdef-box-decoration-break-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"added":25}],"edge":[{"added":130},{"partial_implementation":true,"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:box-decoration-break"]}},"_aliasOf":"box-decoration-break"},"box-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-direction","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-direction"},"box-flex":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-flex","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-flex"},"box-flex-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-flex-group","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","version_last":"66","added":1,"removed":67}],"chrome_android":[{"prefix":"-webkit-","version_last":"66","added":18,"removed":67}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-flex-group"},"box-lines":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-lines","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","version_last":"66","added":1,"removed":67}],"chrome_android":[{"prefix":"-webkit-","version_last":"66","added":18,"removed":67}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-lines"},"box-ordinal-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-ordinal-group"},"box-orient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-orient","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-orient"},"box-pack":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-pack","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-pack"},"box-shadow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-shadow","spec_url":"https://drafts.csswg.org/css-backgrounds/#box-shadow","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":10},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"12","added":3.5,"removed":13}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5.1},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":5},{"prefix":"-webkit-","added":1}]},"tags":["web-features:box-shadow"]},"inset":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"partial_implementation":true,"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:box-shadow"]}},"multiple_shadows":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:box-shadow"]}},"spread_radius":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:box-shadow"]}},"_aliasOf":"box-shadow"},"box-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-sizing","spec_url":"https://drafts.csswg.org/css-sizing/#box-sizing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":10},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":29},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":29},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":8}],"safari":[{"added":5.1},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":6},{"prefix":"-webkit-","added":1}]},"tags":["web-features:box-sizing"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-box-sizing-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:box-sizing"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-box-sizing-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:box-sizing"]}},"_aliasOf":"box-sizing"},"break-after":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-after","spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40438447","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40438447","added":false}],"edge":[{"impl_url":"https://crbug.com/40438447","added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"verso":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}}},"break-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-before","spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":51}],"chrome_android":[{"added":51}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40438447","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40438447","added":false}],"edge":[{"impl_url":"https://crbug.com/40438447","added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"verso":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}}},"break-inside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-inside","spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":51}],"chrome_android":[{"added":51}],"edge":[{"added":12}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}}},"caption-side":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/caption-side","spec_url":["https://drafts.csswg.org/css2/#propdef-caption-side","https://drafts.csswg.org/css-logical/#caption-side"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]},"bottom":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:table"]}},"bottom-outside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"version_last":"16.6","added":13.1,"removed":17}],"safari_ios":[{"version_last":"16.6","added":13.4,"removed":17}]}}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"version_last":"16.6","added":13.1,"removed":17}],"safari_ios":[{"version_last":"16.6","added":13.4,"removed":17}]}}},"top":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:table"]}},"top-outside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}},"writing-mode_relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":42}],"firefox_android":[{"added":42}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}}},"caret-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/caret-color","spec_url":"https://drafts.csswg.org/css-ui/#caret-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:caret-color"]}},"clear":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clear","spec_url":["https://drafts.csswg.org/css2/#propdef-clear","https://drafts.csswg.org/css-logical/#float-clear"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}}},"clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip","spec_url":"https://drafts.fxtf.org/css-masking/#clip-property","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:clip"]},"auto":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip"]}}},"clip-path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip-path","spec_url":"https://drafts.fxtf.org/css-masking/#the-clip-path","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"prefix":"-webkit-","added":23}],"chrome_android":[{"added":55},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"partial_implementation":true,"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"partial_implementation":true,"added":10}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":7}]},"tags":["web-features:clip-path"]},"basic_shape":{"__compat":{"spec_url":"https://drafts.csswg.org/css-shapes/#typedef-basic-shape","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":54}],"firefox_android":[{"added":54}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":51}],"firefox_android":[{"added":51}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"html_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"is_animatable":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:clip-path-animatable"]}},"path":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1},{"prefix":"-webkit-","added":10}],"safari_ios":[{"added":13},{"prefix":"-webkit-","added":10}]},"tags":["web-features:clip-path"]},"_aliasOf":"path"},"stroke-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":51}],"firefox_android":[{"added":51}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":10}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"view-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"_aliasOf":"clip-path","-webkit-path":{"_aliasOf":"path"}},"clip-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip-rule","spec_url":"https://drafts.fxtf.org/css-masking/#the-clip-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]},"evenodd":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking-1/#valdef-clip-rule-evenodd","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}},"nonzero":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking-1/#valdef-clip-rule-nonzero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}}},"color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color","spec_url":["https://drafts.csswg.org/css-color/#the-color-property","https://svgwg.org/svg2-draft/painting.html#ColorProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:color"]}},"color-adjust":{"_aliasOf":"print-color-adjust"},"color-interpolation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-interpolation","spec_url":"https://svgwg.org/svg2-draft/painting.html#ColorInterpolationProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"linearGradient":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":123}],"firefox_android":[{"added":123}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"sRGB":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"color-interpolation-filters":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-interpolation-filters","spec_url":"https://drafts.fxtf.org/filter-effects/#ColorInterpolationFiltersProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:svg-filters"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:svg-filters"]}},"linearRGB":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-linearrgb","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg-filters"]}},"sRGB":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-srgb","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg-filters"]}}},"color-scheme":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-scheme","spec_url":"https://drafts.csswg.org/css-color-adjust/#color-scheme-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]},"dark":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"light":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"normal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"only_dark":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98},{"version_last":"84","added":81,"removed":85}],"chrome_android":[{"added":98},{"version_last":"84","added":81,"removed":85}],"edge":[{"added":98},{"version_last":"84","added":81,"removed":85}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"only_light":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98},{"version_last":"84","added":81,"removed":85}],"chrome_android":[{"added":98},{"version_last":"84","added":81,"removed":85}],"edge":[{"added":98},{"version_last":"84","added":81,"removed":85}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}}},"column-count":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-count","spec_url":"https://drafts.csswg.org/css-multicol/#cc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","version_last":"68","added":4,"removed":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:multi-column"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-count-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]}},"_aliasOf":"column-count"},"column-fill":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-fill","spec_url":"https://drafts.csswg.org/css-multicol/#cf","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":17,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","version_last":"68","added":17,"removed":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":8}]},"tags":["web-features:column-fill"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-fill-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":17}],"firefox_android":[{"added":17}],"ie":[{"added":11}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:column-fill"]}},"balance":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-fill-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":17}],"firefox_android":[{"added":17}],"ie":[{"added":11}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:column-fill"]}},"_aliasOf":"column-fill"},"column-gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-gap","spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-column-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-column-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-column-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-column-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-column-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-column-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-column-gap","added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":10},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":10},{"prefix":"-webkit-","added":3}]},"tags":["web-features:multi-column"]},"calc_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:multi-column"]}},"percentage_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":12}],"safari_ios":[{"added":12}]},"tags":["web-features:multi-column"]}},"_aliasOf":"multicol_context"},"grid-column-gap":{"_aliasOf":"grid_context"},"-webkit-multicol_context":{"_aliasOf":"multicol_context"},"-moz-multicol_context":{"_aliasOf":"multicol_context"}},"column-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule","spec_url":"https://drafts.csswg.org/css-multicol/#column-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule"},"column-rule-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-color","spec_url":"https://drafts.csswg.org/css-multicol/#crc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-color"},"column-rule-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-style","spec_url":"https://drafts.csswg.org/css-multicol/#crs","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-style"},"column-rule-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-width","spec_url":"https://drafts.csswg.org/css-multicol/#crw","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-width"},"column-span":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-span","spec_url":"https://drafts.csswg.org/css-multicol/#column-span","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":6}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":5}]},"tags":["web-features:column-span"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-span-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:column-span"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-span-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:column-span"]}},"_aliasOf":"column-span"},"column-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-width","spec_url":["https://drafts.csswg.org/css-sizing/#column-sizing","https://drafts.csswg.org/css-multicol/#cw"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":50},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]}},"_aliasOf":"column-width"},"columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/columns","spec_url":"https://drafts.csswg.org/css-multicol/#columns","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":9,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":22}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:multi-column"]},"_aliasOf":"columns"},"contain":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain","spec_url":"https://drafts.csswg.org/css-contain/#contain-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]},"content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain#inline-size","spec_url":"https://drafts.csswg.org/css-contain-2/#valdef-contain-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":101}],"firefox_android":[{"added":101}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:contain-inline-size"]}},"layout":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-layout","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-layout"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"paint":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-paint","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-paint"]}},"size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-size"]}},"strict":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-strict","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain#style","spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-style"]}}},"contain-intrinsic-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-block-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-block-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-height","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-height","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-inline-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"auto_none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-width","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"container":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"container-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container-name","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-name","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}}},"container-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container-type","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]},"inline-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"scroll-state":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-scroll-state","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:container-scroll-state-queries"]}},"size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}}},"content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/content","spec_url":"https://drafts.csswg.org/css-content/#content-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]},"alt_text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":128}],"firefox_android":[{"added":128}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:alt-text-generated-content"]}},"element_replacement":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:content"]}},"gradient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images-4/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26}],"chrome_android":[{"added":26}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":113}],"firefox_android":[{"partial_implementation":true,"added":113}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:content"]}},"image-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image/image-set","spec_url":"https://drafts.csswg.org/css-images-4/#image-set-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":20,"removed":113}],"chrome_android":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":25,"removed":113}],"edge":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":79,"removed":113}],"firefox":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"firefox_android":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.1","added":10.1,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.1","added":6,"removed":14}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.4","added":10.3,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.4","added":6,"removed":14}]},"tags":["web-features:image-set"]},"_aliasOf":"image-set"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-content-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"none_applies_to_elements":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.element-content-none.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:content"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-content-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"url":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/url_value","spec_url":"https://drafts.csswg.org/css-values/#urls","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"-webkit-image-set":{"_aliasOf":"image-set"}},"content-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/content-visibility","spec_url":"https://drafts.csswg.org/css-contain/#content-visibility","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/283846","partial_implementation":true,"added":18}],"safari_ios":[{"impl_url":"https://webkit.org/b/283846","partial_implementation":true,"added":18}]},"tags":["web-features:content-visibility"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]}},"is_transitionable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#content-visibility-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"keyframe_animatable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#content-visibility-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]}}},"counter-increment":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-increment","spec_url":"https://drafts.csswg.org/css-lists/#increment-set","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:counters"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:counters"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-set-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:counters"]}}},"counter-reset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-reset","spec_url":"https://drafts.csswg.org/css-lists/#counter-reset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:counters"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":28}],"chrome_android":[{"partial_implementation":true,"added":28}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"partial_implementation":true,"added":9}],"safari_ios":[{"partial_implementation":true,"added":9}]},"tags":["web-features:counters"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-reset-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:counters"]}},"reset_does_not_affect_siblings":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":82}],"firefox_android":[{"added":82}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:counters"]}},"reversed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#css-counter-reversed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:counter-reset-reversed"]}}},"counter-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-set","spec_url":"https://drafts.csswg.org/css-lists/#propdef-counter-set","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-set-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]}}},"cursor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cursor","spec_url":"https://drafts.csswg.org/css-ui/#cursor","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]},"alias":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-alias","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"all-scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-all-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"cell":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-cell","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"col-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-col-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"context-menu":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-context-menu","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"copy":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-copy","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"crosshair":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-crosshair","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"default":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-default","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"e-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-e-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ew-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ew-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"grab":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":68},{"prefix":"-webkit-","added":18}],"edge":[{"added":14}],"firefox":[{"added":27},{"prefix":"-moz-","added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"grab"},"grabbing":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-grabbing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":68},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":27}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"grabbing"},"help":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-help","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"move":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-move","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"n-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-n-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ne-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ne-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nesw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nesw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"no-drop":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-no-drop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":95}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"not-allowed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-not-allowed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ns-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ns-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nwse-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nwse-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"pointer":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-pointer","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"progress":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-progress","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"row-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-row-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"s-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-s-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"se-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-se-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"sw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-sw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"url":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"url_positioning_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"vertical-text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-vertical-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"w-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-w-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"wait":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-wait","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"zoom-in":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-zoom-in","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":37},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":24},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"zoom-in"},"zoom-out":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-zoom-out","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":37},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":24},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"zoom-out"},"-webkit-grab":{"_aliasOf":"grab"},"-moz-grab":{"_aliasOf":"grab"},"-webkit-grabbing":{"_aliasOf":"grabbing"},"-webkit-zoom-in":{"_aliasOf":"zoom-in"},"-moz-zoom-in":{"_aliasOf":"zoom-in"},"-webkit-zoom-out":{"_aliasOf":"zoom-out"},"-moz-zoom-out":{"_aliasOf":"zoom-out"}},"custom-property":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/--*","spec_url":"https://drafts.csswg.org/css-variables/#defining-variables","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":49}],"chrome_android":[{"added":49}],"edge":[{"added":15}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:custom-properties"]}},"cx":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cx","spec_url":"https://svgwg.org/svg2-draft/geometry.html#CX","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"cy":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cy","spec_url":"https://svgwg.org/svg2-draft/geometry.html#CY","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"d":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/d","spec_url":"https://svgwg.org/svg2-draft/paths.html#TheDProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/direction","spec_url":["https://drafts.csswg.org/css-writing-modes/#direction","https://svgwg.org/svg2-draft/text.html#DirectionProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]},"ltr":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-direction-ltr","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"rtl":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-direction-rtl","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"vertical_slider_direction":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":124}],"chrome_android":[{"added":124}],"edge":[{"added":124}],"firefox":[{"partial_implementation":true,"added":120}],"firefox_android":[{"partial_implementation":true,"added":120}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":16.5}],"safari_ios":[{"partial_implementation":true,"added":16.5}]},"tags":["web-features:vertical-form-controls"]}}},"display":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/display","spec_url":["https://drafts.csswg.org/css-display/#the-display-properties","https://svgwg.org/svg2-draft/render.html#VisibilityControl"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#typedef-display-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"contents":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-display-contents","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":65}],"chrome_android":[{"added":65}],"edge":[{"added":79}],"firefox":[{"added":37}],"firefox_android":[{"added":37}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:display-contents"]},"contents_unusual":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":65}],"chrome_android":[{"added":65}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-contents"]}},"focusable_elements":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40866683","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40866683","added":false}],"edge":[{"impl_url":"https://crbug.com/40866683","added":false}],"firefox":[{"impl_url":["https://bugzil.la/1791648","https://bugzil.la/1553549"],"added":false}],"firefox_android":[{"impl_url":["https://bugzil.la/1791648","https://bugzil.la/1553549"],"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/255149","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/255149","added":false}]},"tags":["web-features:display-contents"]}}},"flex":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"partial_implementation":true,"added":11},{"alternative_name":"-ms-flexbox","partial_implementation":true,"added":8}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex"},"flow-root":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":58}],"chrome_android":[{"added":58}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:display-flow-root"]}},"grid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"prefix":"-ms-","added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid"},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#typedef-display-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"inline-block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8},{"partial_implementation":true,"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"inline-flex":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11},{"alternative_name":"-ms-inline-flexbox","added":8}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"inline-flex"},"inline-grid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"prefix":"-ms-","added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"inline-grid"},"inline-table":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"is_transitionable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#display-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"keyframe_animatable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#display-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"list-item":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/display-listitem","spec_url":"https://drafts.csswg.org/css-display/#typedef-display-listitem","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-list-item"]},"legend-support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-list-item"]}}},"math":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"multi-keyword_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:two-value-display"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-display-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]},"option_is_hidden":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display"]}}},"ruby":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-base":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-base-container":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-text-container":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"table":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:display-table"]}},"table-cell":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-column-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-footer-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-header-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-row":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-row-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"-webkit-flex":{"_aliasOf":"flex"},"-ms-flexbox":{"_aliasOf":"flex"},"-ms-grid":{"_aliasOf":"grid"},"-webkit-inline-flex":{"_aliasOf":"inline-flex"},"-ms-inline-flexbox":{"_aliasOf":"inline-flex"},"-ms-inline-grid":{"_aliasOf":"inline-grid"}},"dominant-baseline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/dominant-baseline","spec_url":["https://drafts.csswg.org/css-inline/#dominant-baseline-property","https://svgwg.org/svg2-draft/text.html#DominantBaselineProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]},"alphabetic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-alphabetic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"central":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-central","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"hanging":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-hanging","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"ideographic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-ideographic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"mathematical":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-mathematical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"middle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-middle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}}},"dynamic-range-limit":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#the-dynamic-range-limit-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"constrained-high":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-constrained-high","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"high":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-high","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"standard":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-standard","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"empty-cells":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/empty-cells","spec_url":"https://drafts.csswg.org/css2/#empty-cells","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"field-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/field-sizing","spec_url":"https://drafts.csswg.org/css-ui/#field-sizing","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]},"content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-field-sizing-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]}},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-field-sizing-fixed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]}}},"fill":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"fill-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill-opacity","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-opacity","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:opacity-svg"]}},"fill-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill-rule","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"evenodd":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-fill-rule-evenodd","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"nonzero":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-fill-rule-nonzero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"filter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/filter","spec_url":"https://drafts.fxtf.org/filter-effects/#FilterProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":53},{"prefix":"-webkit-","added":18}],"chrome_android":[{"added":53}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":35},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":35},{"prefix":"-webkit-","added":49}],"ie":[{"added":false}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":6}]},"tags":["web-features:filter"]},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/246106","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/246106","added":false}]},"tags":["web-features:svg-filters"]}},"_aliasOf":"filter"},"flex":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex"},"flex-basis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-basis","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-basis-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":22},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":22},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":22}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"auto"},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":94},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"fit-content"},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":66},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":66},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"min-content"},"_aliasOf":"flex-basis","-webkit-auto":{"_aliasOf":"auto"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"flex-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-direction","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-direction-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"column":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-column","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"column-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-column-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":81},{"partial_implementation":true,"added":72}],"firefox_android":[{"added":81},{"partial_implementation":true,"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"row":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"row-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":81},{"partial_implementation":true,"added":72}],"firefox_android":[{"added":81},{"partial_implementation":true,"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-direction"},"flex-flow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-flow","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-flow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":28},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":28},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex-flow"},"flex-grow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-grow","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-grow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11},{"alternative_name":"-ms-flex-positive","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"less_than_zero_animate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":49}],"chrome_android":[{"added":49}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-grow"},"flex-shrink":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-shrink","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-shrink-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":8}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex-shrink"},"flex-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-wrap","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-wrap-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"partial_implementation":true,"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"nowrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"wrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"wrap-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-wrap-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-wrap"},"float":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/float","spec_url":["https://drafts.csswg.org/css2/#propdef-float","https://drafts.csswg.org/css-logical/#float-clear"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}}},"flood-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flood-color","spec_url":"https://drafts.fxtf.org/filter-effects/#FloodColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"flood-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flood-opacity","spec_url":"https://drafts.fxtf.org/filter-effects/#FloodOpacityProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"font":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font","spec_url":"https://drafts.csswg.org/css-fonts/#font-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]},"caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"font-width_keyword_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-stretch"]}},"icon":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"menu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"message-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"small-caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"status-bar":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}}},"font-family":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family","spec_url":["https://drafts.csswg.org/css-fonts/#generic-font-families","https://drafts.csswg.org/css-fonts/#font-family-prop"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-family"]},"math":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#math","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-family-math"]}},"system-ui":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#system-ui","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":92},{"alternative_name":"-apple-system","added":43}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"-apple-system","added":9}],"safari_ios":[{"added":11},{"alternative_name":"-apple-system","added":9}]},"tags":["web-features:font-family-system"]},"_aliasOf":"system-ui"},"ui-monospace":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-monospace","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-rounded":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-rounded","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-sans-serif":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-sans-serif","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-serif":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-serif","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"-apple-system":{"_aliasOf":"system-ui"}},"font-feature-settings":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-feature-settings","spec_url":"https://drafts.csswg.org/css-fonts/#font-feature-settings-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":16}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":15}],"firefox":[{"added":34},{"prefix":"-webkit-","added":129},{"prefix":"-moz-","added":15}],"firefox_android":[{"added":34},{"prefix":"-webkit-","added":129},{"prefix":"-moz-","added":15}],"ie":[{"added":10}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-feature-settings"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-feature-settings-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-feature-settings"]}},"_aliasOf":"font-feature-settings"},"font-kerning":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-kerning","spec_url":"https://drafts.csswg.org/css-fonts/#font-kerning-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33},{"prefix":"-webkit-","version_last":"32","added":29,"removed":33}],"chrome_android":[{"added":33},{"prefix":"-webkit-","version_last":"32","added":29,"removed":33}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":6}]},"tags":["web-features:font-kerning"]},"_aliasOf":"font-kerning"},"font-language-override":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-language-override","spec_url":"https://drafts.csswg.org/css-fonts/#font-language-override-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34},{"prefix":"-moz-","added":4}],"firefox_android":[{"added":34},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-language-override"]},"_aliasOf":"font-language-override"},"font-optical-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing","spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-def","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-auto-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]}}},"font-palette":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-palette","spec_url":"https://drafts.csswg.org/css-fonts/#font-palette-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]},"animation_computed":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-palette-animation"]}},"dark":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-dark","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"light":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-light","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"palette-mix_function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-palette/palette-mix","spec_url":"https://drafts.csswg.org/css-fonts/#typedef-font-palette-palette-mix","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-palette-animation"]}}},"font-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-size","spec_url":"https://drafts.csswg.org/css-fonts/#font-size-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-size"]},"math":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"rem_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":42}],"edge":[{"added":12}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":9}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-size"]}},"xxx-large":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size"]}}},"font-size-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-size-adjust","spec_url":"https://drafts.csswg.org/css-fonts-5/#font-size-adjust-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":3},{"partial_implementation":true,"version_last":"2","added":1,"removed":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size-adjust"]},"from-font":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts-5/#valdef-font-size-adjust-from-font","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:font-size-adjust"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts-5/#valdef-font-size-adjust-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size-adjust"]}},"two-values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:font-size-adjust"]}}},"font-smooth":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-smooth","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"alternative_name":"-webkit-font-smoothing","added":5}],"chrome_android":[{"alternative_name":"-webkit-font-smoothing","added":18}],"edge":[{"alternative_name":"-webkit-font-smoothing","added":79}],"firefox":[{"alternative_name":"-moz-osx-font-smoothing","added":25}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-font-smoothing","added":4}],"safari_ios":[{"alternative_name":"-webkit-font-smoothing","added":3.2}]}},"_aliasOf":"font-smooth"},"font-stretch":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-stretch","spec_url":"https://drafts.csswg.org/css-fonts/#font-stretch-prop","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":12}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":9}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-stretch"]},"percentage":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":18}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:font-stretch"]}}},"font-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-style","spec_url":"https://drafts.csswg.org/css-fonts/#font-style-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]},"italic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-italic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]}},"oblique-angle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-oblique-angle--90deg-90deg","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:font-style"]}}},"font-synthesis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:font-synthesis"]},"position":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis"]}},"small-caps":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}},"style":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}},"weight":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}}},"font-synthesis-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-position","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-position","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-position-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-position-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]}}},"font-synthesis-small-caps":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-small-caps","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-small-caps-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-small-caps-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]}}},"font-synthesis-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-style","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-style-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]}}},"font-synthesis-weight":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-weight","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-weight","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-weight-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-weight-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]}}},"font-variant":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant","spec_url":["https://drafts.csswg.org/css-fonts/#font-variant-prop","https://svgwg.org/svg2-draft/text.html#FontVariantProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-variant"]},"css_fonts_shorthand":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"greek_accented_characters":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant"]}},"historical-forms":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-alternates-historical-forms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-size-adjust-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:font-variant"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-variant"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"turkic_is":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:font-variant"]}},"uppercase_eszett":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant"]}}},"font-variant-alternates":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-alternates-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-alternates"]},"annotation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#annotation()","spec_url":"https://drafts.csswg.org/css-fonts/#annotation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"character_variant":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#character-variant()","spec_url":"https://drafts.csswg.org/css-fonts/#character-variant","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"historical-forms":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-alternates-historical-forms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-alternates"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-alternates-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-alternates"]}},"ornaments":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#ornaments()","spec_url":"https://drafts.csswg.org/css-fonts/#ornaments","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"styleset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#styleset()","spec_url":"https://drafts.csswg.org/css-fonts/#styleset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"stylistic":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#stylistic()","spec_url":"https://drafts.csswg.org/css-fonts/#stylistic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"swash":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#swash()","spec_url":"https://drafts.csswg.org/css-fonts/#swash","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}}},"font-variant-caps":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-caps","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-caps-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]},"all-petite-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-petite-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"all-small-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"petite-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-petite-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"small-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"titling-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-titling-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"unicase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-unicase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}}},"font-variant-east-asian":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-east-asian-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]},"full-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-full-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis04":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis04","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis78":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis78","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis83":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis83","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis90":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis90","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-east-asian-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"proportional-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-proportional-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"ruby":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-ruby","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"simplified":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-simplified","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"traditional":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-traditional","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}}},"font-variant-emoji":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-emoji","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-emoji-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"flags":[{"name":"layout.css.font-variant-emoji.enabled","type":"preference","value_to_set":"true"}],"added":108}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"flags":[{"name":"CSS font-variant-emoji property","type":"preference","value_to_set":"true"}],"added":17.5}],"safari_ios":[{"flags":[{"name":"CSS font-variant-emoji property","type":"preference","value_to_set":"true"}],"added":17.5}]},"tags":["web-features:font-variant-emoji"]},"emoji":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-emoji","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-text","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"unicode":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-unicode","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}}},"font-variant-ligatures":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":34},{"prefix":"-webkit-","added":31}],"chrome_android":[{"added":34},{"prefix":"-webkit-","added":31}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":7}]},"tags":["web-features:font-variant-ligatures"]},"common-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-common-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"contextual":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-contextual","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"discretionary-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-discretionary-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"historical-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-common-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-contextual":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-contextual","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-discretionary-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-discretionary-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-historical-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"_aliasOf":"font-variant-ligatures"},"font-variant-numeric":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-numeric-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]},"diagonal-fractions":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-diagonal-fractions","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"lining-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-lining-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-numeric-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"oldstyle-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-oldstyle-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"ordinal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-ordinal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"proportional-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-proportional-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"slashed-zero":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-slashed-zero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"stacked-fractions":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-stacked-fractions","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"tabular-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-tabular-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}}},"font-variant-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-position","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-position-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-position-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-position"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-position"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-position"]}}},"font-variation-settings":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variation-settings","spec_url":"https://drafts.csswg.org/css-fonts/#font-variation-settings-def","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-variation-settings"]}},"font-weight":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-weight","spec_url":"https://drafts.csswg.org/css-fonts/#font-weight-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]},"bold":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-bold","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"bolder":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-bolder","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"lighter":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-lighter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"number":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":17}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-weight"]}}},"font-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#propdef-font-width","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]},"condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"extra-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-extra-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"extra-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-extra-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"semi-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-semi-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"semi-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-semi-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"ultra-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-ultra-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"ultra-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-ultra-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}}},"forced-color-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/forced-color-adjust","spec_url":"https://drafts.csswg.org/css-color-adjust/#forced-color-adjust-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79},{"alternative_name":"-ms-high-contrast-adjust","added":12}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"alternative_name":"-ms-high-contrast-adjust","added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"preserve-parent-color":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-preserve-parent-color","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":106}],"chrome_android":[{"added":106}],"edge":[{"added":106}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"_aliasOf":"forced-color-adjust"},"gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gap","spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-gap","added":10.3}]},"tags":["web-features:grid"]},"calc_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:grid"]}},"percentage_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}},"_aliasOf":"grid_context"},"multicol_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:multi-column"]}},"grid-gap":{"_aliasOf":"grid_context"}},"glyph-orientation-vertical":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes-4/#glyph-orientation","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:glyph-orientation-vertical"]}},"grid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid","spec_url":"https://drafts.csswg.org/css-grid/#grid-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-area":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-area","spec_url":"https://drafts.csswg.org/css-grid/#propdef-grid-area","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-auto-columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns","spec_url":"https://drafts.csswg.org/css-grid/#auto-tracks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-columns","version_last":"18","added":12,"removed":79}],"firefox":[{"added":70},{"partial_implementation":true,"version_last":"69","added":52,"removed":70}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":52,"removed":79}],"ie":[{"alternative_name":"-ms-grid-columns","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid-auto-columns"},"grid-auto-flow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow","spec_url":"https://drafts.csswg.org/css-grid/#grid-auto-flow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"column":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-column","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"dense":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-dense","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"row":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-row","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-auto-rows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows","spec_url":"https://drafts.csswg.org/css-grid/#auto-tracks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-rows","version_last":"18","added":12,"removed":79}],"firefox":[{"added":70},{"partial_implementation":true,"version_last":"69","added":52,"removed":70}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":52,"removed":79}],"ie":[{"alternative_name":"-ms-grid-rows","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid-auto-rows"},"grid-column":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column","spec_url":"https://drafts.csswg.org/css-grid/#placement-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-column-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column-end","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-column-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column-start","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row","spec_url":"https://drafts.csswg.org/css-grid/#placement-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row-end","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row-start","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-template":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template","spec_url":"https://drafts.csswg.org/css-grid/#explicit-grid-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-template-areas":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-areas","spec_url":"https://drafts.csswg.org/css-grid/#grid-template-areas-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-areas-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-template-columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-columns","spec_url":["https://drafts.csswg.org/css-grid/#track-sizing","https://drafts.csswg.org/css-grid/#subgrids"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-columns","version_last":"18","added":12,"removed":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"alternative_name":"-ms-grid-columns","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"animation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":107}],"chrome_android":[{"added":107}],"edge":[{"added":107}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:grid-animation"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content_function","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"masonry":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-3/#masonry-layout","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40128480","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40128480","added":false}],"edge":[{"impl_url":"https://crbug.com/40128480","added":false}],"firefox":[{"flags":[{"name":"layout.css.grid-template-masonry-value.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://bugzil.la/1757446","added":77}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/248287","added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:masonry"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"minmax":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/minmax","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-minmax","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-rows-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/repeat","spec_url":"https://drafts.csswg.org/css-grid/#repeat-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":76},{"partial_implementation":true,"version_last":"75","added":57,"removed":76},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":57,"removed":79},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"subgrid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Subgrid","spec_url":"https://drafts.csswg.org/css-grid/#subgrids","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:subgrid"]}},"_aliasOf":"grid-template-columns"},"grid-template-rows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-rows","spec_url":["https://drafts.csswg.org/css-grid/#track-sizing","https://drafts.csswg.org/css-grid/#subgrids"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-rows","version_last":"18","added":12,"removed":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"alternative_name":"-ms-grid-rows","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"animation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":107}],"chrome_android":[{"added":107}],"edge":[{"added":107}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:grid-animation"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"masonry":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Masonry_layout","spec_url":"https://drafts.csswg.org/css-grid-3/#masonry-layout","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40128480","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40128480","added":false}],"edge":[{"impl_url":"https://crbug.com/40128480","added":false}],"firefox":[{"flags":[{"name":"layout.css.grid-template-masonry-value.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://bugzil.la/1757446","added":77}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/248287","added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:masonry"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"minmax":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/minmax","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-minmax","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-rows-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/repeat","spec_url":"https://drafts.csswg.org/css-grid/#repeat-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":76},{"partial_implementation":true,"version_last":"75","added":57,"removed":76},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":57,"removed":79},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"subgrid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Subgrid","spec_url":"https://drafts.csswg.org/css-grid/#subgrids","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:subgrid"]}},"_aliasOf":"grid-template-rows"},"hanging-punctuation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation","spec_url":"https://drafts.csswg.org/css-text/#hanging-punctuation-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":10}],"safari_ios":[{"partial_implementation":true,"added":10}]},"tags":["web-features:hanging-punctuation"]},"allow-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-allow-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:hanging-punctuation"]}},"first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-first","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:hanging-punctuation"]}},"last":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-last","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:hanging-punctuation"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:hanging-punctuation"]}}},"height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/height","spec_url":["https://drafts.csswg.org/css-sizing/#preferred-size-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#preferred-size-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":9}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":9}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"hyphenate-character":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphenate-character","spec_url":"https://drafts.csswg.org/css-text-4/#propdef-hyphenate-character","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":106},{"prefix":"-webkit-","added":6}],"chrome_android":[{"added":106},{"prefix":"-webkit-","added":18}],"edge":[{"added":106},{"prefix":"-webkit-","added":79}],"firefox":[{"added":98}],"firefox_android":[{"added":98}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":5}]},"tags":["web-features:hyphenate-character"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-hyphenate-character-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":98}],"firefox_android":[{"added":98}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphenate-character"]}},"_aliasOf":"hyphenate-character"},"hyphenate-limit-chars":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphenate-limit-chars","spec_url":"https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-chars","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphenate-limit-chars"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-hyphenate-limit-chars-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphenate-limit-chars"]}}},"hyphens":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphens","spec_url":"https://drafts.csswg.org/css-text/#hyphens-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"prefix":"-webkit-","added":13}],"chrome_android":[{"added":55},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79},{"partial_implementation":true,"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":43},{"prefix":"-moz-","added":6}],"firefox_android":[{"added":43},{"prefix":"-moz-","added":6}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":17},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:hyphens"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88},{"partial_implementation":true,"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":88},{"partial_implementation":true,"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":4.2}]},"tags":["web-features:hyphens"]}},"language_afrikaans":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_albanian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_amharic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_armenian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_assamese":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_basque":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_belarusian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bengali":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bosnian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bulgarian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_catalan":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_croatian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_cyrillic_mongolian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_czech":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":130}],"firefox_android":[{"added":130}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_danish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_dutch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_english":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":12}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":10}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_esperanto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_estonian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ethiopic_script_mul":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ethiopic_script_und":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_finnish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_french":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_galician":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_georgian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_german_reformed_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_german_swiss_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_german_traditional_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_gujarati":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_hindi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_hungarian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_icelandic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_interlingua":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_irish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_italian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_kannada":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_kurmanji":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_latin":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_latvian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_lithuanian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_malayalam":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_marathi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_modern_greek":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_mongolian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_norwegian_nn":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_norwegian_no":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_old_slavonic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_oriya":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_polish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_portuguese":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_punjabi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_russian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_slovak":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":130}],"firefox_android":[{"added":130}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_slovenian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_spanish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_swedish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_tamil":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_telugu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_turkish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_turkmen":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ukrainian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_upper_sorbian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_welsh":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"_aliasOf":"hyphens"},"image-orientation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image-orientation","spec_url":"https://drafts.csswg.org/css-images/#the-image-orientation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]},"from-image":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-orientation-from-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-orientation-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]}}},"image-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image-rendering","spec_url":["https://drafts.csswg.org/css-images/#the-image-rendering","https://svgwg.org/svg2-draft/painting.html#ImageRendering"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:image-rendering"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:image-rendering"]}},"crisp-edges":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-crisp-edges","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-optimize-contrast","added":13}],"chrome_android":[{"alternative_name":"-webkit-optimize-contrast","added":18}],"edge":[{"alternative_name":"-webkit-optimize-contrast","added":79}],"firefox":[{"added":65},{"prefix":"-moz-","added":3.6}],"firefox_android":[{"added":65},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":7},{"alternative_name":"-webkit-optimize-contrast","added":6}],"safari_ios":[{"added":7},{"alternative_name":"-webkit-optimize-contrast","added":6}]},"tags":["web-features:crisp-edges"]},"_aliasOf":"crisp-edges"},"optimizeQuality":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"optimizeSpeed":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"pixelated":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-pixelated","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:image-rendering"]}},"smooth":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-smooth","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:smooth"]}},"-webkit-optimize-contrast":{"_aliasOf":"crisp-edges"},"-moz-crisp-edges":{"_aliasOf":"crisp-edges"}},"ime-mode":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#input-method-editor","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:ime-mode"]},"_aliasOf":"ime-mode"},"initial-letter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/initial-letter","spec_url":"https://drafts.csswg.org/css-inline/#sizing-drop-initials","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"impl_url":"https://bugzil.la/1223880","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1223880","added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":9}],"safari_ios":[{"prefix":"-webkit-","added":9}]},"tags":["web-features:initial-letter"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-initial-letter-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:initial-letter"]}},"_aliasOf":"initial-letter"},"inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inline-size","spec_url":["https://drafts.csswg.org/css-logical/#dimension-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57},{"alternative_name":"-webkit-logical-width","added":8}],"chrome_android":[{"added":57},{"alternative_name":"-webkit-logical-width","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-logical-width","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-logical-width","added":5.1}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-logical-width","added":5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"inline-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset","https://drafts.csswg.org/css-position/#propdef-inset"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}}},"inset-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block","https://drafts.csswg.org/css-position/#propdef-inset-block"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block"},"inset-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block-end","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block-end","https://drafts.csswg.org/css-position/#propdef-inset-block-end"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block-end","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block-end","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block-end"},"inset-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block-start","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block-start","https://drafts.csswg.org/css-position/#propdef-inset-block-start"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block-start","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block-start","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block-start"},"inset-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline","https://drafts.csswg.org/css-position/#propdef-inset-inline"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline"},"inset-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline-end","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline-end","https://drafts.csswg.org/css-position/#propdef-inset-inline-end"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline-end","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline-end","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline-end"},"inset-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline-start","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline-start","https://drafts.csswg.org/css-position/#propdef-inset-inline-start"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline-start","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline-start","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline-start"},"interactivity":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#propdef-interactivity","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-interactivity-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"inert":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-interactivity-inert","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"interpolate-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/interpolate-size","spec_url":"https://drafts.csswg.org/css-values-5/#interpolate-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]},"allow-keywords":{"__compat":{"spec_url":"https://drafts.csswg.org/css-values-5/#valdef-interpolate-size-allow-keywords","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]}},"numeric-only":{"__compat":{"spec_url":"https://drafts.csswg.org/css-values-5/#valdef-interpolate-size-numeric-only","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]}}},"isolation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/isolation","spec_url":"https://drafts.fxtf.org/compositing/#isolation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:isolation"]}},"justify-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-content","spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52},{"partial_implementation":true,"version_last":"51","added":21,"removed":52}],"chrome_android":[{"added":52},{"partial_implementation":true,"version_last":"51","added":25,"removed":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"left_right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"space-evenly":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"_aliasOf":"justify-content"},"justify-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-items","spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"justify-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-self","spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}},"-ms-grid_context":{"_aliasOf":"grid_context"}},"left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/left","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"letter-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/letter-spacing","spec_url":["https://drafts.csswg.org/css-text/#letter-spacing-property","https://svgwg.org/svg2-draft/text.html#LetterSpacingProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:letter-spacing"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-letter-spacing-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:letter-spacing"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}}},"lighting-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/lighting-color","spec_url":"https://drafts.fxtf.org/filter-effects/#LightingColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"line-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-break","spec_url":"https://drafts.csswg.org/css-text/#line-break-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":58},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":58},{"prefix":"-webkit-","added":18}],"edge":[{"added":14}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":5.5},{"prefix":"-ms-","added":8}],"safari":[{"added":11},{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":1}]},"tags":["web-features:line-break"]},"anywhere":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-anywhere","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:line-break"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:line-break"]}},"loose":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-loose","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:line-break"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:line-break"]}},"strict":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-strict","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:line-break"]}},"_aliasOf":"line-break"},"line-clamp":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-clamp","spec_url":"https://drafts.csswg.org/css-overflow-4/#propdef-line-clamp","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40336192","prefix":"-webkit-","added":6}],"chrome_android":[{"impl_url":"https://crbug.com/40336192","prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":17}],"firefox":[{"prefix":"-webkit-","added":68}],"firefox_android":[{"prefix":"-webkit-","added":68}],"ie":[{"added":false}],"safari":[{"added":18.2},{"prefix":"-webkit-","added":5}],"safari_ios":[{"added":18.2},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:line-clamp"]},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:line-clamp"]}},"_aliasOf":"line-clamp"},"line-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-height","spec_url":"https://drafts.csswg.org/css-inline/#line-height-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:line-height"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-line-height-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:line-height"]}}},"line-height-step":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-height-step","spec_url":"https://drafts.csswg.org/css-rhythm/#line-height-step","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":60}],"chrome_android":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":60}],"edge":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:rhythmic-sizing"]}},"list-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style","spec_url":"https://drafts.csswg.org/css-lists/#list-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"symbols":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/symbols","spec_url":"https://drafts.csswg.org/css-counter-styles/#symbols-function","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:list-style"]}}},"list-style-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-image","spec_url":"https://drafts.csswg.org/css-lists/#image-markers","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-list-style-image-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}}},"list-style-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-position","spec_url":"https://drafts.csswg.org/css-lists/#list-style-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"inside":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-list-style-position-inside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"outside":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#list-style-position-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}}},"list-style-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-type","spec_url":["https://drafts.csswg.org/css-lists/#text-markers","https://drafts.csswg.org/css-counter-styles/#extending-css2"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"afar":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"amharic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"amharic-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"arabic-indic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-arabic-indic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"arabic-indic"},"armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"asterisks":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"bengali":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-bengali","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"bengali"},"binary":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"cambodian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cambodian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"cjk-decimal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#cjk-decimal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"cjk-earthly-branch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cjk-earthly-branch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"cjk-earthly-branch"},"cjk-heavenly-stem":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cjk-heavenly-stem","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"cjk-heavenly-stem"},"cjk-ideographic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#cjk-ideographic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"decimal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#decimal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"decimal-leading-zero":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#decimal-leading-zero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"devanagari":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-devanagari","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"devanagari"},"disc":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"disclosure-closed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disclosure-closed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"disclosure-open":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disclosure-open","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"ethiopic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-am-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-gez":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-ti-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-ti-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]}},"_aliasOf":"ethiopic-halehame"},"ethiopic-halehame-aa-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-aa-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-am":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]}},"_aliasOf":"ethiopic-halehame-am"},"ethiopic-halehame-am-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-gez":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-om-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-sid-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-so-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-ti-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"ethiopic-halehame-ti-er"},"ethiopic-halehame-ti-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"ethiopic-halehame-ti-et"},"ethiopic-halehame-tig":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-numeric":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-ethiopic-numeric","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"ethiopic-numeric"},"footnotes":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"georgian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#georgian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"gujarati":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-gujarati","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"gujarati"},"gurmukhi":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-gurmukhi","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"gurmukhi"},"hangul":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"hangul"},"hangul-consonant":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"hangul-consonant"},"hebrew":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hebrew","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"hiragana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hiragana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"hiragana-iroha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hiragana-iroha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"japanese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#japanese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"japanese-formal"},"japanese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#japanese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"japanese-informal"},"kannada":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-kannada","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"kannada"},"katakana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#katakana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"katakana-iroha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#katakana-iroha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"khmer":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-khmer","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"khmer"},"korean-hangul-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hangul-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"korean-hanja-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hanja-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"korean-hanja-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hanja-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"lao":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-lao","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"lao"},"lower-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-lower-armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:list-style"]}},"lower-greek":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-greek","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-hexadecimal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"lower-latin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-latin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-norwegian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"lower-roman":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-roman","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"malayalam":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-malayalam","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"malayalam"},"mongolian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-mongolian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"myanmar":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-myanmar","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"myanmar"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-list-style-type-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"octal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"oriya":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-oriya","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"oriya"},"oromo":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"persian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-persian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"persian"},"sidama":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"simp-chinese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#simp-chinese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"simp-chinese-formal"},"simp-chinese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#simp-chinese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"simp-chinese-informal"},"somali":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"square":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#square","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"string":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":79}],"firefox":[{"added":39}],"firefox_android":[{"added":39}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:list-style"]}},"symbols":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/symbols","spec_url":"https://drafts.csswg.org/css-counter-styles/#symbols-function","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:list-style"]}},"tamil":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-tamil","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"tamil"},"telugu":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-telugu","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"telugu"},"thai":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-thai","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"thai"},"tibetan":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-tibetan","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"tigre":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-er-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-et-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"trad-chinese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#trad-chinese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"trad-chinese-formal"},"trad-chinese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#trad-chinese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"trad-chinese-informal"},"upper-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"upper-armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-upper-armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:list-style"]}},"upper-greek":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":1,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]}}},"upper-hexadecimal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"upper-latin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-latin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"upper-norwegian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"upper-roman":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-roman","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"urdu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":33}],"firefox_android":[{"prefix":"-moz-","added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"urdu"},"-moz-arabic-indic":{"_aliasOf":"arabic-indic"},"-moz-bengali":{"_aliasOf":"bengali"},"-moz-cjk-earthly-branch":{"_aliasOf":"cjk-earthly-branch"},"-moz-cjk-heavenly-stem":{"_aliasOf":"cjk-heavenly-stem"},"-moz-devanagari":{"_aliasOf":"devanagari"},"-moz-ethiopic-halehame":{"_aliasOf":"ethiopic-halehame"},"-moz-ethiopic-halehame-am":{"_aliasOf":"ethiopic-halehame-am"},"-moz-ethiopic-halehame-ti-er":{"_aliasOf":"ethiopic-halehame-ti-er"},"-moz-ethiopic-halehame-ti-et":{"_aliasOf":"ethiopic-halehame-ti-et"},"-moz-ethiopic-numeric":{"_aliasOf":"ethiopic-numeric"},"-moz-gujarati":{"_aliasOf":"gujarati"},"-moz-gurmukhi":{"_aliasOf":"gurmukhi"},"-moz-hangul":{"_aliasOf":"hangul"},"-moz-hangul-consonant":{"_aliasOf":"hangul-consonant"},"-moz-japanese-formal":{"_aliasOf":"japanese-formal"},"-moz-japanese-informal":{"_aliasOf":"japanese-informal"},"-moz-kannada":{"_aliasOf":"kannada"},"-moz-khmer":{"_aliasOf":"khmer"},"-moz-lao":{"_aliasOf":"lao"},"-moz-malayalam":{"_aliasOf":"malayalam"},"-moz-myanmar":{"_aliasOf":"myanmar"},"-moz-oriya":{"_aliasOf":"oriya"},"-moz-persian":{"_aliasOf":"persian"},"-moz-simp-chinese-formal":{"_aliasOf":"simp-chinese-formal"},"-moz-simp-chinese-informal":{"_aliasOf":"simp-chinese-informal"},"-moz-tamil":{"_aliasOf":"tamil"},"-moz-telugu":{"_aliasOf":"telugu"},"-moz-thai":{"_aliasOf":"thai"},"-moz-trad-chinese-formal":{"_aliasOf":"trad-chinese-formal"},"-moz-trad-chinese-informal":{"_aliasOf":"trad-chinese-informal"},"-moz-urdu":{"_aliasOf":"urdu"}},"margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin","spec_url":"https://drafts.csswg.org/css-box/#margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-margin-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block-end","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block-start","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-bottom","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-margin-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-margin-end","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-margin-end","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-margin-end","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-margin-end","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-margin-end","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-margin-end","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-margin-end","added":3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"margin-inline-end"},"margin-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-margin-start","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-margin-start","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-margin-start","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-margin-start","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-margin-start","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-margin-start","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-margin-start","added":3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"margin-inline-start"},"margin-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-left","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-right","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-top","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-trim","spec_url":"https://drafts.csswg.org/css-box-4/#margin-trim","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}}},"marker":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerShorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"marker-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-end","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerEndProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"marker-mid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-mid","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerMidProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"marker-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-start","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerStartProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"mask":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1},{"partial_implementation":true,"version_last":"119","added":1,"removed":120}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18},{"partial_implementation":true,"version_last":"119","added":18,"removed":120}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"partial_implementation":true,"version_last":"119","added":79,"removed":120},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":53},{"partial_implementation":true,"version_last":"52","added":2,"removed":53}],"firefox_android":[{"added":53},{"partial_implementation":true,"version_last":"52","added":4,"removed":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1},{"partial_implementation":true,"version_last":"15.3","added":3.1,"removed":15.4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2},{"partial_implementation":true,"version_last":"15.3","added":2,"removed":15.4}]},"tags":["web-features:masks"]},"_aliasOf":"mask"},"mask-border":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border"},"mask-border-outset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-outset","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-outset","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-outset","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-outset","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-outset","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-outset","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-outset"},"mask-border-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-repeat","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-repeat","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-repeat","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-repeat","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-repeat","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-repeat"},"mask-border-slice":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-slice","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-slice","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-slice","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-slice","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-slice","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-slice","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-slice"},"mask-border-source":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-source","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-source","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-source","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-source","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-source","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-source","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-source"},"mask-border-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-width","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-width","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-width","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-width","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-width","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-width","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-width"},"mask-clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-clip","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"border":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"padding":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-clip"},"mask-composite":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-composite","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-composite","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53},{"prefix":"-webkit-","added":53}],"firefox_android":[{"added":53},{"prefix":"-webkit-","added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]},"add":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-add","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"exclude":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-exclude","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"intersect":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-intersect","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"subtract":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-subtract","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-composite"},"mask-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-image","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":16,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"multiple_mask_images":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"svg_masks":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-image"},"mask-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-mode","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]},"alpha":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"luminance":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-luminance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"match-source":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-match-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}}},"mask-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-origin","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-origin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"border":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"border"},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"content"},"fill-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"padding":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"padding"},"stroke-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"view-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-origin","-webkit-border":{"_aliasOf":"border"},"-webkit-content":{"_aliasOf":"content"},"-webkit-padding":{"_aliasOf":"padding"}},"mask-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-position","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-position"},"mask-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-repeat","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-repeat"},"mask-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-size","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":4}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-size"},"mask-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-type","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]},"alpha":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-type-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]}},"luminance":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-type-luminance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]}}},"math-depth":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-depth","spec_url":"https://w3c.github.io/mathml-core/#the-math-script-level-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/202303","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/202303","added":false}]},"tags":["web-features:mathml"]}},"math-shift":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-shift","spec_url":"https://w3c.github.io/mathml-core/#the-math-shift","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"math-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-style","spec_url":"https://w3c.github.io/mathml-core/#the-math-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:mathml"]}},"max-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-block-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-max-block-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94}],"firefox_android":[{"added":94}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"max-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-height","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-max-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":18}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"max-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-inline-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-max-inline-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":10.1}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":10.3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"max-inline-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"max-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-width","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-max-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"min-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"min-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-block-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-min-block-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94}],"firefox_android":[{"added":94}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"min-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-height","spec_url":["https://drafts.csswg.org/css-sizing/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":34},{"version_last":"21","added":16,"removed":22}],"firefox_android":[{"added":34},{"version_last":"21","added":16,"removed":22}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:min-max-width-height"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":9}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":9}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"min-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-inline-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-min-inline-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"min-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-width","spec_url":["https://drafts.csswg.org/css-sizing/#min-size-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":34},{"version_last":"21","added":16,"removed":22}],"firefox_android":[{"added":34},{"version_last":"21","added":16,"removed":22}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:min-max-width-height"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"min-intrinsic","version_last":"47","added":25,"removed":48}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"min-intrinsic","version_last":"47","added":25,"removed":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"min-intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"min-intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"intrinsic":{"_aliasOf":"max-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"min-intrinsic":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"mix-blend-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode","spec_url":"https://drafts.fxtf.org/compositing/#mix-blend-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:mix-blend-mode"]},"plus-darker":{"__compat":{"spec_url":"https://drafts.fxtf.org/compositing/#plus-darker","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:mix-blend-mode"]}},"plus-lighter":{"__compat":{"spec_url":"https://drafts.fxtf.org/compositing/#plus-lighter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":100}],"chrome_android":[{"added":100}],"edge":[{"added":100}],"firefox":[{"added":99}],"firefox_android":[{"added":99}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:mix-blend-mode"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":false}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mix-blend-mode"]}}},"object-fit":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/object-fit","spec_url":"https://drafts.csswg.org/css-images/#the-object-fit","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":16,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"cover":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-cover","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"fill":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-fill","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"scale-down":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-scale-down","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"_aliasOf":"object-fit"},"object-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/object-position","spec_url":"https://drafts.csswg.org/css-images/#the-object-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":16,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-position"]},"_aliasOf":"object-position"},"object-view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images-5/#propdef-object-view-box","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:object-view-box"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images-5/#valdef-object-view-box-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:object-view-box"]}}},"offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset","spec_url":"https://drafts.fxtf.org/motion/#offset-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion","added":46}],"edge":[{"added":79},{"alternative_name":"motion","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"_aliasOf":"offset"},"offset-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-anchor","spec_url":"https://drafts.fxtf.org/motion/#offset-anchor-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-anchor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"bottom":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"center":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"left":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"right":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"top":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}}},"offset-distance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-distance","spec_url":"https://drafts.fxtf.org/motion/#offset-distance-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion-distance","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion-distance","added":46}],"edge":[{"added":79},{"alternative_name":"motion-distance","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"_aliasOf":"offset-distance"},"offset-path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-path","spec_url":"https://drafts.fxtf.org/motion/#offset-path-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion-path","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion-path","added":46}],"edge":[{"added":79},{"alternative_name":"motion-path","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:motion-path"]},"basic_shape":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-basic-shape","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"margin-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-margin-box","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"none":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"path":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"ray":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-ray","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"stroke-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"url":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-url","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:motion-path"]}},"view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"_aliasOf":"offset-path"},"offset-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-position","spec_url":"https://drafts.fxtf.org/motion/#offset-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"bottom":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"center":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"left":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"normal":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:motion-path"]}},"right":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"top":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}}},"offset-rotate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-rotate","spec_url":"https://drafts.fxtf.org/motion/#offset-rotate-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56},{"alternative_name":"offset-rotation","added":55},{"alternative_name":"motion-rotation","added":46}],"chrome_android":[{"added":56},{"alternative_name":"offset-rotation","added":55},{"alternative_name":"motion-rotation","added":46}],"edge":[{"added":79},{"alternative_name":"offset-rotation","added":79},{"alternative_name":"motion-rotation","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-rotate-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"reverse":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-rotate-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"_aliasOf":"offset-rotate"},"opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/opacity","spec_url":["https://drafts.csswg.org/css-color/#propdef-opacity","https://svgwg.org/svg2-draft/render.html#ObjectAndGroupOpacityProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1},{"prefix":"-moz-","version_last":"3","added":1,"removed":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":2},{"prefix":"-khtml-","version_last":"1.3","added":1.1,"removed":2}],"safari_ios":[{"added":1}]},"tags":["web-features:opacity"]},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":78}],"chrome_android":[{"added":78}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:opacity"]}},"_aliasOf":"opacity"},"order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/order","spec_url":"https://drafts.csswg.org/css-display/#order-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"order"},"orphans":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/orphans","spec_url":"https://drafts.csswg.org/css-break/#widows-orphans","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:widows-orphans"]}},"outline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline","spec_url":"https://drafts.csswg.org/css-ui/#outline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94},{"partial_implementation":true,"version_last":"93","added":1,"removed":94}],"chrome_android":[{"added":94},{"partial_implementation":true,"version_last":"93","added":18,"removed":94}],"edge":[{"added":94},{"partial_implementation":true,"version_last":"93","added":12,"removed":94}],"firefox":[{"added":88},{"partial_implementation":true,"version_last":"87","added":1.5,"removed":88},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":88},{"partial_implementation":true,"version_last":"87","added":4,"removed":88}],"ie":[{"added":8}],"safari":[{"added":16.4},{"partial_implementation":true,"version_last":"16.3","added":1.2,"removed":16.4}],"safari_ios":[{"added":16.4},{"partial_implementation":true,"version_last":"16.3","added":1,"removed":16.4}]},"tags":["web-features:outline"]},"_aliasOf":"outline"},"outline-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-color","spec_url":"https://drafts.csswg.org/css-ui/#outline-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"_aliasOf":"outline-color"},"outline-offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-offset","spec_url":"https://drafts.csswg.org/css-ui/#outline-offset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"outline-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-style","spec_url":"https://drafts.csswg.org/css-ui/#outline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#outline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"dashed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-dashed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"dotted":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-dotted","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"double":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-double","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"groove":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-groove","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"inset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-inset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"outset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"ridge":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-ridge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"solid":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-solid","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"_aliasOf":"outline-style"},"outline-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-width","spec_url":"https://drafts.csswg.org/css-ui/#outline-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"_aliasOf":"outline-width"},"overflow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow","spec_url":["https://drafts.csswg.org/css-overflow/#propdef-overflow","https://svgwg.org/svg2-draft/render.html#OverflowAndClipProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":114}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":114}],"edge":[{"added":12}],"firefox":[{"added":1},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":12}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":12}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":1.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"multiple_keywords":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68}],"chrome_android":[{"added":68}],"edge":[{"added":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overflow-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-anchor","spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#exclusion-api","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#valdef-overflow-anchor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#valdef-overflow-anchor-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]}}},"overflow-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-block","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]},"overlay":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":112}],"firefox_android":[{"added":112}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]}}},"overflow-clip-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-clip-margin","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-clip-margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":90}],"chrome_android":[{"partial_implementation":true,"added":90}],"edge":[{"partial_implementation":true,"added":90}],"firefox":[{"partial_implementation":true,"added":102}],"firefox_android":[{"partial_implementation":true,"added":102}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}}},"overflow-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-inline","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]},"overlay":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":112}],"firefox_android":[{"added":112}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]}}},"overflow-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-wrap","spec_url":"https://drafts.csswg.org/css-text/#overflow-wrap-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23},{"alternative_name":"word-wrap","added":1}],"chrome_android":[{"added":25},{"alternative_name":"word-wrap","added":18}],"edge":[{"added":18},{"alternative_name":"word-wrap","added":12}],"firefox":[{"added":49},{"alternative_name":"word-wrap","added":3.5}],"firefox_android":[{"added":49},{"alternative_name":"word-wrap","added":4}],"ie":[{"alternative_name":"word-wrap","added":5.5}],"safari":[{"added":7},{"alternative_name":"word-wrap","added":1}],"safari_ios":[{"added":7},{"alternative_name":"word-wrap","added":1}]},"tags":["web-features:overflow-wrap"]},"anywhere":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-anywhere","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:overflow-wrap"]}},"break-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-break-word","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-wrap"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-wrap"]}},"_aliasOf":"overflow-wrap"},"overflow-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-x","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":15}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":100}],"edge":[{"added":12}],"firefox":[{"added":3.5},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":13.1}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":13.4}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":3.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"_aliasOf":"overflow-x","overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overflow-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-y","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":15}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":100}],"edge":[{"added":12}],"firefox":[{"added":3.5},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":13.1}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":13.4}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":3.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"_aliasOf":"overflow-y","overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overlay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overlay","spec_url":"https://drafts.csswg.org/css-position-4/#overlay","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-4/#valdef-overlay-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-4/#valdef-overlay-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]}}},"overscroll-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"padding":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding","spec_url":"https://drafts.csswg.org/css-box/#padding-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"padding-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block-end","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"padding-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block-start","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"padding-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-bottom","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-padding-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"padding-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-padding-end","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-padding-end","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-padding-end","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-padding-end","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-padding-end","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-padding-end","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-padding-end","added":3}]},"tags":["web-features:logical-properties"]},"_aliasOf":"padding-inline-end"},"padding-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-padding-start","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-padding-start","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-padding-start","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-padding-start","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-padding-start","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-padding-start","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-padding-start","added":3}]},"tags":["web-features:logical-properties"]},"_aliasOf":"padding-inline-start"},"padding-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-left","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-right","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-top","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"page":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page","spec_url":"https://drafts.csswg.org/css-page/#using-named-pages","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-selectors"]}},"page-break-after":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-after","spec_url":["https://drafts.csswg.org/css-logical/#page","https://drafts.csswg.org/css-page/#page-break-after","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-always","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"impl_url":"https://bugzil.la/775617","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/775617","added":false}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/34155","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/34155","added":false}]},"tags":["web-features:page-break-aliases"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-left","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-right","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"page-break-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-before","spec_url":["https://drafts.csswg.org/css-logical/#page","https://drafts.csswg.org/css-page/#page-break-before","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-always","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"impl_url":"https://bugzil.la/775617","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/775617","added":false}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/34155","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/34155","added":false}]},"tags":["web-features:page-break-aliases"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-left","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-right","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"page-break-inside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-inside","spec_url":["https://drafts.csswg.org/css-page/#page-break-inside","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"paint-order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/paint-order","spec_url":"https://svgwg.org/svg2-draft/painting.html#PaintOrderProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123},{"partial_implementation":true,"added":35}],"chrome_android":[{"added":123},{"partial_implementation":true,"added":35}],"edge":[{"added":123},{"partial_implementation":true,"added":79}],"firefox":[{"added":60}],"firefox_android":[{"added":60}],"ie":[{"added":false}],"safari":[{"added":11},{"partial_implementation":true,"added":8}],"safari_ios":[{"added":11},{"partial_implementation":true,"added":8}]},"tags":["web-features:paint-order"]}},"perspective":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/perspective","spec_url":"https://drafts.csswg.org/css-transforms-2/#perspective-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms3d"]}},"_aliasOf":"perspective"},"perspective-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/perspective-origin","spec_url":"https://drafts.csswg.org/css-transforms-2/#perspective-origin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"_aliasOf":"perspective-origin"},"place-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-content","spec_url":"https://drafts.csswg.org/css-align/#place-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"place-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-items","spec_url":"https://drafts.csswg.org/css-align/#place-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"place-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-self","spec_url":"https://drafts.csswg.org/css-align/#place-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#place-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}}},"pointer-events":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/pointer-events","spec_url":["https://drafts.csswg.org/css-ui/#pointer-events-control","https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:pointer-events"]},"html_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:pointer-events"]}}},"position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position","spec_url":"https://drafts.csswg.org/css-position/#position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:position"]},"absolute":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-absolute","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:absolute-positioning"]}},"absolutely_positioned_flex_children":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":10}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-fixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:fixed-positioning"]}},"position_sticky_table_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":16}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:sticky-positioning"]}},"relative":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-relative","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:relative-positioning"]}},"static":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-static","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:static-positioning"]}},"sticky":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-sticky","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":16}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":13},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":13},{"prefix":"-webkit-","added":7}]},"tags":["web-features:sticky-positioning"]},"_aliasOf":"sticky"},"-webkit-sticky":{"_aliasOf":"sticky"}},"position-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-anchor","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-anchor","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-anchor","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":125}],"chrome_android":[{"partial_implementation":true,"added":125}],"edge":[{"partial_implementation":true,"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"position-area":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-area","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-area","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"chrome_android":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"edge":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-bottom","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-inline-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-left","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-right","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-bottom","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-inline-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-top","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-x-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-x-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-x-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-x-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-y-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-y-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-y-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-y-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-top","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"position-area"},"position-try":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-prop","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"position-try-fallbacks":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try-fallbacks","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-fallbacks","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"chrome_android":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"edge":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"flip-block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flip-inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flip-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"position-area":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-position-area","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128},{"version_last":"127","added":125,"removed":128}],"chrome_android":[{"added":128},{"version_last":"127","added":125,"removed":128}],"edge":[{"added":128},{"version_last":"127","added":125,"removed":128}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"position-try-fallbacks"},"position-try-order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try-order","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-order-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"most-block-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-block-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-height":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-height","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-inline-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-inline-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-width","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"position-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-visibility","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-visibility","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-always","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchors-visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-anchors-visible","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"no-overflow":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-no-overflow","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"print-color-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/print-color-adjust","spec_url":"https://drafts.csswg.org/css-color-adjust/#propdef-print-color-adjust","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"prefix":"-webkit-","added":17}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":97},{"alternative_name":"color-adjust","added":48}],"firefox_android":[{"added":97},{"alternative_name":"color-adjust","added":48}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":6}]},"tags":["web-features:print-color-adjust"]},"economy":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-print-color-adjust-economy","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:print-color-adjust"]}},"exact":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-print-color-adjust-exact","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:print-color-adjust"]}},"_aliasOf":"print-color-adjust"},"quotes":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/quotes","spec_url":"https://drafts.csswg.org/css-content/#quotes","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:quotes"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-quotes-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:quotes"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-quotes-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:quotes"]}}},"r":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/r","spec_url":"https://svgwg.org/svg2-draft/geometry.html#R","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"reading-flow":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#reading-flow","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"chrome_android":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"edge":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:reading-flow"]}},"resize":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/resize","spec_url":"https://drafts.csswg.org/css-ui/#resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]},"block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}},"block_level_support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}},"inline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}}},"right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/right","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"rotate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/rotate","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}},"x_y_z_angle":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"row-gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/row-gap","spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-row-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-row-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-row-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-row-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-row-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-row-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-row-gap","added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"grid-row-gap":{"_aliasOf":"grid_context"}},"ruby-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ruby-align","spec_url":"https://drafts.csswg.org/css-ruby/#ruby-align-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"space-around":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-space-around","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"space-between":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-space-between","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}}},"ruby-overhang":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#propdef-ruby-overhang","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-overhang-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-overhang-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]}}},"ruby-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ruby-position","spec_url":"https://drafts.csswg.org/css-ruby/#rubypos","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":84},{"prefix":"-webkit-","added":18}],"edge":[{"added":84},{"prefix":"-webkit-","added":79},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":18.2},{"prefix":"-webkit-","added":7}]},"tags":["web-features:ruby-position"]},"alternate":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40174517","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40174517","added":false}],"edge":[{"impl_url":"https://crbug.com/40174517","added":false}],"firefox":[{"added":88}],"firefox_android":[{"added":88}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:ruby-position"]}},"inter-character":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":84}],"chrome_android":[{"partial_implementation":true,"added":84}],"edge":[{"partial_implementation":true,"added":84}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"over":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"_aliasOf":"ruby-position"},"rx":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/rx","spec_url":"https://svgwg.org/svg2-draft/geometry.html#RX","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"ry":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ry","spec_url":"https://svgwg.org/svg2-draft/geometry.html#RY","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"scale":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scale","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"scroll-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-behavior","spec_url":"https://drafts.csswg.org/css-overflow/#smooth-scrolling","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]}},"smooth":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scroll-behavior-smooth","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]}}},"scroll-initial-target":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#propdef-scroll-initial-target","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]},"nearest":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#valdef-scroll-initial-target-nearest","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#valdef-scroll-initial-target-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]}}},"scroll-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":90},{"partial_implementation":true,"version_last":"89","added":68,"removed":90}],"firefox_android":[{"added":90},{"partial_implementation":true,"version_last":"89","added":68,"removed":90}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin"},"scroll-margin-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-margin-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-bottom","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-bottom","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-bottom"},"scroll-margin-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-margin-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-left","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-left","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-left"},"scroll-margin-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-right","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-right","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-right"},"scroll-margin-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-top","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-top","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-top"},"scroll-marker-group":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#scroll-marker-group-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"after":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-after","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"before":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-before","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"scroll-padding":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-padding","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-snap-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-align","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}}},"scroll-snap-stop":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-stop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-stop-always","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-stop-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-snap-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":99},{"partial_implementation":true,"version_last":"98","added":68,"removed":99},{"version_last":"67","added":39,"removed":68}],"firefox_android":[{"added":68},{"version_last":"67","added":39,"removed":68}],"ie":[{"prefix":"-ms-","added":10}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:scroll-snap"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":39}],"firefox_android":[{"added":39}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-x","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"_aliasOf":"scroll-snap-type"},"scroll-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-timeline-shorthand","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"scroll-timeline-axis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-axis","spec_url":"https://drafts.csswg.org/scroll-animations/#propdef-scroll-timeline-axis","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-x","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-y","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"scroll-timeline-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-name","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-timeline-name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"scrollbar-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-color","spec_url":"https://drafts.csswg.org/css-scrollbars/#scrollbar-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/231590","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/231590","added":false}]},"tags":["web-features:scrollbar-color"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-color-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scrollbar-color"]}}},"scrollbar-gutter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter","spec_url":"https://drafts.csswg.org/css-overflow/#scrollbar-gutter-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scrollbar-gutter-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]}},"stable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scrollbar-gutter-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]}}},"scrollbar-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-width","spec_url":"https://drafts.csswg.org/css-scrollbars/#scrollbar-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}},"thin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-thin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}}},"shape-image-threshold":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold","spec_url":"https://drafts.csswg.org/css-shapes/#shape-image-threshold-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":78}],"chrome_android":[{"added":78}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:shape-outside"]}}},"shape-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-margin","spec_url":"https://drafts.csswg.org/css-shapes/#shape-margin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1},{"prefix":"-webkit-","added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"_aliasOf":"shape-margin"},"shape-outside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-outside","spec_url":"https://drafts.csswg.org/css-shapes/#shape-outside-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"circle":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#circle()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"gradient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image","spec_url":"https://drafts.csswg.org/css-images/#image-values","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#inset()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-shapes/#valdef-shape-outside-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape/path","spec_url":"https://drafts.csswg.org/css-shapes/#funcdef-basic-shape-path","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:shape-outside"]}},"polygon":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#polygon()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}}},"shape-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-rendering","spec_url":"https://svgwg.org/svg2-draft/painting.html#ShapeRendering","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"speak":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#speaking-props-speak","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":80}],"chrome_android":[{"partial_implementation":true,"added":80}],"edge":[{"partial_implementation":true,"added":80}],"firefox":[{"impl_url":"https://bugzil.la/1748064","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1748064","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:speak"]}},"speak-as":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/speak-as","spec_url":"https://drafts.csswg.org/css-speech-1/#speaking-props-speak-as","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"impl_url":"https://bugzil.la/1748068","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1748068","added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]},"digits":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-digits","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"literal-punctuation":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-literal-punctuation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"no-punctuation":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-no-punctuation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"spell-out":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-spell-out","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}}},"stop-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stop-color","spec_url":"https://svgwg.org/svg2-draft/pservers.html#StopColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stop-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stop-opacity","spec_url":"https://svgwg.org/svg2-draft/pservers.html#StopOpacityProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke","spec_url":"https://svgwg.org/svg2-draft/painting.html#SpecifyingStrokePaint","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke-color":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-color","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke-dasharray":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-dasharray","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-dasharray","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"none":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-dasharray-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"stroke-dashoffset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-dashoffset","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-dashoffset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke-linecap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-linecap","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-linecap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"butt":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-butt","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"round":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"square":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-square","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"stroke-linejoin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-linejoin","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-linejoin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"bevel":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-bevel","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"miter":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-miter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"round":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"stroke-miterlimit":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-miterlimit","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-miterlimit","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-opacity","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-opacity","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:opacity-svg"]}},"stroke-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-width","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"tab-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/tab-size","spec_url":"https://drafts.csswg.org/css-text/#tab-size-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":91},{"prefix":"-moz-","added":4}],"firefox_android":[{"added":91},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:tab-size"]},"length":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/length","spec_url":"https://drafts.csswg.org/css-values/#lengths","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":42}],"chrome_android":[{"added":42}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:tab-size"]}},"_aliasOf":"tab-size"},"table-layout":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/table-layout","spec_url":"https://drafts.csswg.org/css2/#width-layout","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":14}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":3}]},"tags":["web-features:table"]}},"text-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-align","spec_url":["https://drafts.csswg.org/css-logical/#text-align","https://drafts.csswg.org/css-text/#text-align-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-align"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"center"},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:text-align"]}},"justify":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-justify","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-align"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"left"},"match-parent":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-match-parent","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"prefix":"-webkit-","added":16}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-align"]},"_aliasOf":"match-parent"},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"right"},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:text-align"]}},"-webkit-center":{"_aliasOf":"center"},"-moz-center":{"_aliasOf":"center"},"-khtml-center":{"_aliasOf":"center"},"-webkit-left":{"_aliasOf":"left"},"-moz-left":{"_aliasOf":"left"},"-khtml-left":{"_aliasOf":"left"},"-webkit-match-parent":{"_aliasOf":"match-parent"},"-webkit-right":{"_aliasOf":"right"},"-moz-right":{"_aliasOf":"right"},"-khtml-right":{"_aliasOf":"right"}},"text-align-last":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-align-last","spec_url":"https://drafts.csswg.org/css-text/#text-align-last-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":12}],"firefox":[{"added":49},{"prefix":"-moz-","version_last":"52","added":12,"removed":53}],"firefox_android":[{"added":49},{"prefix":"-moz-","version_last":"52","added":14,"removed":53}],"ie":[{"partial_implementation":true,"added":5.5}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:text-align-last"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-last-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":12}],"firefox":[{"added":12}],"firefox_android":[{"added":14}],"ie":[{"added":11}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:text-align-last"]}},"_aliasOf":"text-align-last"},"text-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-anchor","spec_url":"https://svgwg.org/svg2-draft/text.html#TextAnchorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"text-autospace":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#propdef-text-autospace","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"ideograph-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-ideograph-alpha","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"ideograph-numeric":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-ideograph-numeric","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"no-autospace":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-no-autospace","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}}},"text-box":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-box-edge":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box-edge","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-edge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-edge-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-box-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box-trim","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-trim","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-combine-upright":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-combine-upright","spec_url":"https://drafts.csswg.org/css-writing-modes/#text-combine-upright","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":9}],"chrome_android":[{"added":48},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":18}],"edge":[{"added":79},{"alternative_name":"-ms-text-combine-horizontal","version_last":"18","added":12,"removed":79}],"firefox":[{"added":48}],"firefox_android":[{"added":48}],"ie":[{"alternative_name":"-ms-text-combine-horizontal","added":11}],"safari":[{"added":15.4},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":5.1}],"safari_ios":[{"added":15.4},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":5}]},"tags":["web-features:text-combine-upright"]},"_aliasOf":"text-combine-upright"},"text-decoration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration","spec_url":["https://drafts.csswg.org/css-text-decor/#text-decoration-property","https://svgwg.org/svg2-draft/text.html#TextDecorationProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-decoration"]},"includes_color-and-style":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":8}],"safari_ios":[{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"_aliasOf":"includes_color-and-style"},"includes_thickness":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"-webkit-includes_color-and-style":{"_aliasOf":"includes_color-and-style"}},"text-decoration-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-color","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-color-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"_aliasOf":"text-decoration-color"},"text-decoration-line":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-line","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-line-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"blink":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-blink","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration-line-blink"]}},"grammar-error":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-grammar-error","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"line-through":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-line-through","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"overline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-overline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"spelling-error":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-spelling-error","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"underline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-underline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-line"},"text-decoration-skip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-skipping","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"version_last":"63","added":57,"removed":64}],"chrome_android":[{"version_last":"63","added":57,"removed":64}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-decoration"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-skip"},"text-decoration-skip-ink":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-skip-ink-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40675832","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40675832","added":false}],"edge":[{"impl_url":"https://crbug.com/40675832","added":false}],"firefox":[{"added":75}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}}},"text-decoration-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-style","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"wavy":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-style"},"text-decoration-thickness":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-width-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"chrome_android":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"edge":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-thickness-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]}},"from-font":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-thickness-from-font","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]}},"percentage":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-decoration"]}}},"text-emphasis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"_aliasOf":"text-emphasis"},"text-emphasis-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-color-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"_aliasOf":"text-emphasis-color"},"text-emphasis-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":132}],"firefox_android":[{"added":132}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-emphasis"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-emphasis"]}},"over":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":108}],"firefox_android":[{"added":108}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-emphasis"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":108}],"firefox_android":[{"added":108}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"_aliasOf":"text-emphasis-position"},"text-emphasis-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"dot":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-dot","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"double-circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-double-circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"filled":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-filled","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"sesame":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-sesame","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"triangle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-triangle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"_aliasOf":"text-emphasis-style"},"text-indent":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-indent","spec_url":"https://drafts.csswg.org/css-text/#text-indent-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-indent"]},"each-line":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-indent-each-line","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:text-indent-each-line"]}},"hanging":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-indent-hanging","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:text-indent-hanging"]}}},"text-justify":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-justify","spec_url":"https://drafts.csswg.org/css-text/#text-justify-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":32}],"chrome_android":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":32}],"edge":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":79},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/99945","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/99945","added":false}]},"tags":["web-features:text-justify"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"inter-character":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-inter-character","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55},{"alternative_name":"distribute","added":55}],"firefox_android":[{"added":55},{"alternative_name":"distribute","added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]},"_aliasOf":"inter-character"},"inter-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-inter-word","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"distribute":{"_aliasOf":"inter-character"}},"text-orientation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-orientation","spec_url":"https://drafts.csswg.org/css-writing-modes/#text-orientation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":11}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":14},{"prefix":"-webkit-","added":5}]},"tags":["web-features:text-orientation"]},"mixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-mixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-orientation"]}},"sideways":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-sideways","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25},{"alternative_name":"sideways-right","added":83}],"chrome_android":[{"added":25},{"alternative_name":"sideways-right","added":83}],"edge":[{"added":79},{"alternative_name":"sideways-right","added":83}],"firefox":[{"added":44},{"alternative_name":"sideways-right","added":72}],"firefox_android":[{"added":44},{"alternative_name":"sideways-right","added":79}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-orientation"]},"_aliasOf":"sideways"},"upright":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-upright","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-orientation"]}},"_aliasOf":"text-orientation","sideways-right":{"_aliasOf":"sideways"}},"text-overflow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-overflow","spec_url":["https://drafts.csswg.org/css-overflow/#text-overflow","https://svgwg.org/svg2-draft/text.html#TextOverflowProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":6},{"prefix":"-ms-","added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]}},"ellipsis":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#overflow-ellipsis","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]}},"string":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:custom-ellipses"]}},"two_value_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-overflow"]}},"_aliasOf":"text-overflow"},"text-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-rendering","spec_url":"https://svgwg.org/svg2-draft/painting.html#TextRenderingProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}},"geometricPrecision":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg"]}}},"text-shadow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-shadow","spec_url":"https://drafts.csswg.org/css-text-decor/#text-shadow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-shadow"]}},"text-size-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-size-adjust","spec_url":"https://drafts.csswg.org/css-size-adjust/#adjustment-control","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79},{"prefix":"-webkit-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":14}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"prefix":"-webkit-","added":1}]},"tags":["web-features:text-size-adjust"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"percentages":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-percentage-0","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"_aliasOf":"text-size-adjust"},"text-spacing-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-spacing-trim","spec_url":"https://drafts.csswg.org/css-text-4/#text-spacing-trim-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"space-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-space-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"space-first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-space-first","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"trim-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-trim-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}}},"text-transform":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-transform","spec_url":"https://drafts.csswg.org/css-text-4/#text-transform","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]},"capitalize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-capitalize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"dutch_ij_digraph":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-transform"]}},"full-size-kana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-full-size-kana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:text-transform"]}},"full-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-full-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:text-transform"]}},"greek_accented_characters":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":34}],"chrome_android":[{"added":34}],"edge":[{"added":79}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-transform"]}},"lowercase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-lowercase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"lowercase_sigma":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:text-transform"]}},"math-auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-math-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"turkic_is":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-transform"]}},"uppercase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-uppercase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"uppercase_eszett":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}}},"text-underline-offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-underline-offset","spec_url":"https://drafts.csswg.org/css-text-decor-4/#underline-offset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-offset"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-underline-offset-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-offset"]}},"percentage":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-underline-offset-percentage","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-offset"]}}},"text-underline-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-underline-position","spec_url":"https://drafts.csswg.org/css-text-decor/#text-underline-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33}],"chrome_android":[{"added":33}],"edge":[{"added":12}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":6}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":9}]},"tags":["web-features:text-underline-position"]},"from-font":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-position"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-position"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-position"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33}],"chrome_android":[{"added":33}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-position"]}},"_aliasOf":"text-underline-position"},"text-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap"]},"balance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#balance","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-balance"]}},"nowrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#nowrap","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-mode-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-nowrap"]}},"pretty":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#pretty","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-wrap-pretty"]}},"stable":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#stable","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-stable"]}},"wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#wrap","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-mode-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap"]}}},"text-wrap-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap-mode","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]},"nowrap":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]}},"wrap":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]}}},"text-wrap-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap-style","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}},"balance":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}},"pretty":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-wrap-style"]}},"stable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}}},"timeline-scope":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/timeline-scope","spec_url":"https://drafts.csswg.org/scroll-animations/#propdef-timeline-scope","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-timeline-scope-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-timeline-scope-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/top","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"touch-action":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/touch-action","spec_url":["https://compat.spec.whatwg.org/#touch-action","https://w3c.github.io/pointerevents/#the-touch-action-css-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":9.3}]},"tags":["web-features:touch-action"]},"manipulation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":9.3}]},"tags":["web-features:touch-action"]},"_aliasOf":"manipulation"},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"none"},"pan-down":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-up":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pan-x"},"pan-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pan-y"},"pinch-zoom":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":12}],"firefox":[{"added":85}],"firefox_android":[{"added":85}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pinch-zoom"},"_aliasOf":"touch-action","-ms-manipulation":{"_aliasOf":"manipulation"},"-ms-none":{"_aliasOf":"none"},"-ms-pan-x":{"_aliasOf":"pan-x"},"-ms-pan-y":{"_aliasOf":"pan-y"},"-ms-pinch-zoom":{"_aliasOf":"pinch-zoom"}},"transform":{"3d":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms3d"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform","spec_url":["https://drafts.csswg.org/css-transforms-2/#transform-functions","https://drafts.csswg.org/css-transforms/#transform-property","https://svgwg.org/svg2-draft/coords.html#TransformProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":10},{"prefix":"-webkit-","added":11},{"prefix":"-ms-","added":9}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:transforms2d"]},"_aliasOf":"transform"},"transform-box":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-box","spec_url":"https://drafts.csswg.org/css-transforms/#transform-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:transform-box"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"stroke-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}}},"transform-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-origin","spec_url":"https://drafts.csswg.org/css-transforms/#transform-origin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":10},{"prefix":"-ms-","added":9}],"safari":[{"added":9},{"prefix":"-webkit-","added":2}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:transforms2d"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":17}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg"]}},"three_value_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms2d"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"_aliasOf":"transform-origin"},"transform-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-style","spec_url":"https://drafts.csswg.org/css-transforms-2/#transform-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"_aliasOf":"transform-style"},"transition":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition","spec_url":"https://drafts.csswg.org/css-transitions/#transition-shorthand-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"preview","added":4,"removed":null}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4,"removed":false}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"gradients_can_animate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:transitions"]}},"transition-behavior":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":129}],"firefox_android":[{"added":129}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:transition-behavior"]}},"_aliasOf":"transition"},"transition-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-behavior","spec_url":"https://drafts.csswg.org/css-transitions-2/#transition-behavior-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":129}],"firefox_android":[{"added":129}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:transition-behavior"]}},"transition-delay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-delay","spec_url":"https://drafts.csswg.org/css-transitions/#transition-delay-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"_aliasOf":"transition-delay"},"transition-duration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-duration","spec_url":"https://drafts.csswg.org/css-transitions/#transition-duration-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"_aliasOf":"transition-duration"},"transition-property":{"IDENT_value":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3}]},"tags":["web-features:transitions"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-property","spec_url":"https://drafts.csswg.org/css-transitions/#transition-property-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transitions/#valdef-transition-property-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:transitions"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transitions/#propdef-transition-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:transitions"]}},"_aliasOf":"transition-property"},"transition-timing-function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-timing-function","spec_url":"https://drafts.csswg.org/css-transitions/#transition-timing-function-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"jump":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":14}],"safari_ios":[{"added":14}]},"tags":["web-features:transitions"]}},"_aliasOf":"transition-timing-function"},"translate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/translate","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"unicode-bidi":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/unicode-bidi","spec_url":"https://drafts.csswg.org/css-writing-modes/#unicode-bidi","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]},"bidi-override":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-bidi-override","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"embed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-embed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"isolate":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-isolate","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":16}],"chrome_android":[{"added":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":6}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"isolate"},"isolate-override":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-isolate-override","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":17,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":17,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"isolate-override"},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"plaintext":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-plaintext","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":6}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"plaintext"},"-webkit-isolate":{"_aliasOf":"isolate"},"-moz-isolate":{"_aliasOf":"isolate"},"-moz-isolate-override":{"_aliasOf":"isolate-override"},"-webkit-isolate-override":{"_aliasOf":"isolate-override"},"-moz-plaintext":{"_aliasOf":"plaintext"},"-webkit-plaintext":{"_aliasOf":"plaintext"}},"user-modify":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/user-modify","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"partial_implementation":true,"prefix":"-moz-","version_last":"131","added":1,"removed":132}],"firefox_android":[{"partial_implementation":true,"prefix":"-moz-","version_last":"131","added":4,"removed":132}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":5}]}},"read-write-plaintext-only":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":5}]}}},"_aliasOf":"user-modify"},"user-select":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/user-select","spec_url":"https://drafts.csswg.org/css-ui/#content-selection","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":54},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":54},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":12},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":69},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":79},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"prefix":"-ms-","added":10}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":3}]},"tags":["web-features:user-select"]},"all":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":53}],"chrome_android":[{"added":53}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:user-select"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]}},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":21},{"prefix":"-moz-","version_last":"64","added":1,"removed":65}],"firefox_android":[{"added":21},{"prefix":"-moz-","version_last":"64","added":4,"removed":65}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]},"_aliasOf":"none"},"text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]}},"_aliasOf":"user-select","-moz-none":{"_aliasOf":"none"}},"vector-effect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/vector-effect","spec_url":"https://svgwg.org/svg2-draft/coords.html#VectorEffectProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"vertical-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/vertical-align","spec_url":"https://drafts.csswg.org/css-inline/#propdef-vertical-align","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]},"baseline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-baseline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"middle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-middle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"text-bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-text-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"text-top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-text-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}}},"view-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-shorthand","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view-timeline-axis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-axis","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-axis","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-x","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-y","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"view-timeline-inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-inset","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-inset","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-view-timeline-inset-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"view-timeline-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-name","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view-transition-class":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions-2/#view-transition-class-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1860854","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1860854","added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:view-transition-class"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions-2/#valdef-view-transition-class-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:view-transition-class"]}}},"view-transition-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-transition-name","spec_url":"https://drafts.csswg.org/css-view-transitions/#view-transition-name-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"impl_url":"https://bugzil.la/1823896","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1823896","added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:view-transitions"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions/#valdef-view-transition-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:view-transitions"]}}},"visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/visibility","spec_url":["https://drafts.csswg.org/css-display/#visibility","https://svgwg.org/svg2-draft/render.html#VisibilityControl"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]},"collapse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}}},"white-space":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/white-space","spec_url":["https://drafts.csswg.org/css-text-4/#white-space-property","https://svgwg.org/svg2-draft/text.html#TextWhiteSpace"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]},"break-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-break-spaces","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":76}],"chrome_android":[{"added":76}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:white-space"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"nowrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre-line":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre-line","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre-wrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]},"_aliasOf":"pre-wrap"},"shorthand_values":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":114}],"chrome_android":[{"partial_implementation":true,"added":114}],"edge":[{"partial_implementation":true,"added":114}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space"]}},"textarea_support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"-moz-pre-wrap":{"_aliasOf":"pre-wrap"}},"white-space-collapse":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/white-space-collapse","spec_url":"https://drafts.csswg.org/css-text-4/#white-space-collapsing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]},"break-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-break-spaces","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"collapse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve-breaks":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve-breaks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve-spaces","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space-collapse"]}}},"widows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/widows","spec_url":["https://drafts.csswg.org/css-break/#widows-orphans","https://drafts.csswg.org/css-multicol/#filling-columns"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:widows-orphans"]}},"width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/width","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#preferred-size-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content","spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22},{"alternative_name":"intrinsic","version_last":"47","added":1,"removed":48}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"intrinsic","version_last":"47","added":18,"removed":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content_function","spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"is_animatable":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26}],"chrome_android":[{"added":26}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:width-height"]}},"max-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-content","spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-content","spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"alternative_name":"min-intrinsic","version_last":"47","added":1,"removed":48}],"chrome_android":[{"added":46},{"alternative_name":"min-intrinsic","version_last":"47","added":18,"removed":48}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"min-intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"min-intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"alternative_name":"-moz-available","added":3}],"firefox_android":[{"alternative_name":"-moz-available","added":4}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":7}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":7}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"max-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"min-intrinsic":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"},"-moz-available":{"_aliasOf":"stretch"}},"will-change":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/will-change","spec_url":"https://drafts.csswg.org/css-will-change/#will-change","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}},"contents":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-contents","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}},"scroll-position":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-scroll-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}}},"word-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/word-break","spec_url":"https://drafts.csswg.org/css-text/#word-break-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":5.5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]},"auto-phrase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-word-break-auto-phrase","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:word-break-auto-phrase"]}},"break-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-break-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]}},"break-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-break-word","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":67}],"firefox_android":[{"added":67}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break-break-word"]}},"keep-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-keep-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":44}],"chrome_android":[{"added":44}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":5.5}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:word-break"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]}},"_aliasOf":"word-break"},"word-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/word-spacing","spec_url":["https://drafts.csswg.org/css-text/#word-spacing-property","https://svgwg.org/svg2-draft/text.html#WordSpacingProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:word-spacing"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-spacing-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:word-spacing"]}},"percentages":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}}},"writing-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/writing-mode","spec_url":["https://drafts.csswg.org/css-writing-modes/#block-flow","https://svgwg.org/svg2-draft/text.html#WritingModeProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":8}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":9},{"prefix":"-ms-","added":9}],"safari":[{"added":10.1},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":10.3},{"prefix":"-webkit-","added":5}]},"tags":["web-features:writing-mode"]},"horizontal-tb":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"lr":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"lr-tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"rl":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"rl-tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"sideways-lr":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:writing-mode"]}},"sideways-rl":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:writing-mode"]}},"tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"tb-rl":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"vertical-lr":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"vertical-rl":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"vertical_oriented_form_controls":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"chrome_android":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"edge":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"firefox":[{"added":120}],"firefox_android":[{"added":120}],"ie":[{"added":false}],"safari":[{"added":17.4},{"partial_implementation":true,"added":16.5}],"safari_ios":[{"added":17.4},{"partial_implementation":true,"added":16.5}]},"tags":["web-features:vertical-form-controls"]}},"_aliasOf":"writing-mode"},"x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/x","spec_url":"https://svgwg.org/svg2-draft/geometry.html#X","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/y","spec_url":"https://svgwg.org/svg2-draft/geometry.html#Y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"z-index":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/z-index","spec_url":"https://drafts.csswg.org/css2/#z-index","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-z-index-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]}},"negative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]}}},"zoom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/zoom","spec_url":"https://drafts.csswg.org/css-viewport/#zoom-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":126}],"firefox_android":[{"added":126}],"ie":[{"added":5.5}],"safari":[{"added":3.1}],"safari_ios":[{"added":3}]},"tags":["web-features:zoom"]},"reset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/zoom#Values","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"58","added":1,"removed":59}],"chrome_android":[{"version_last":"58","added":18,"removed":59}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"18.3","added":3.1,"removed":18.4}],"safari_ios":[{"version_last":"18.3","added":3,"removed":18.4}]}}}},"-webkit-align-content":{"_aliasOf":"align-content"},"-webkit-align-items":{"_aliasOf":"align-items"},"-webkit-align-self":{"_aliasOf":"align-self"},"-webkit-alt":{"_aliasOf":"alt"},"-webkit-animation":{"_aliasOf":"animation"},"-moz-animation":{"_aliasOf":"animation"},"-o-animation":{"_aliasOf":"animation"},"-webkit-animation-delay":{"_aliasOf":"animation-delay"},"-moz-animation-delay":{"_aliasOf":"animation-delay"},"-o-animation-delay":{"_aliasOf":"animation-delay"},"-webkit-animation-direction":{"_aliasOf":"animation-direction"},"-moz-animation-direction":{"_aliasOf":"animation-direction"},"-o-animation-direction":{"_aliasOf":"animation-direction"},"-webkit-animation-duration":{"_aliasOf":"animation-duration"},"-moz-animation-duration":{"_aliasOf":"animation-duration"},"-o-animation-duration":{"_aliasOf":"animation-duration"},"-webkit-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-moz-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-o-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-webkit-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-moz-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-o-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-webkit-animation-name":{"_aliasOf":"animation-name"},"-moz-animation-name":{"_aliasOf":"animation-name"},"-o-animation-name":{"_aliasOf":"animation-name"},"-webkit-animation-play-state":{"_aliasOf":"animation-play-state"},"-moz-animation-play-state":{"_aliasOf":"animation-play-state"},"-o-animation-play-state":{"_aliasOf":"animation-play-state"},"-webkit-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-moz-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-o-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-webkit-appearance":{"_aliasOf":"appearance"},"-moz-appearance":{"_aliasOf":"appearance"},"-webkit-backdrop-filter":{"_aliasOf":"backdrop-filter"},"-webkit-backface-visibility":{"_aliasOf":"backface-visibility"},"-moz-backface-visibility":{"_aliasOf":"backface-visibility"},"-webkit-background-clip":{"_aliasOf":"background-clip"},"-moz-background-clip":{"_aliasOf":"background-clip"},"-webkit-background-origin":{"_aliasOf":"background-origin"},"-moz-background-origin":{"_aliasOf":"background-origin"},"-webkit-background-size":{"_aliasOf":"background-size"},"-moz-background-size":{"_aliasOf":"background-size"},"-o-background-size":{"_aliasOf":"background-size"},"-webkit-border-bottom-left-radius":{"_aliasOf":"border-bottom-left-radius"},"-moz-border-radius-bottomleft":{"_aliasOf":"border-bottom-left-radius"},"-webkit-border-bottom-right-radius":{"_aliasOf":"border-bottom-right-radius"},"-moz-border-radius-bottomright":{"_aliasOf":"border-bottom-right-radius"},"-webkit-border-image":{"_aliasOf":"border-image"},"-moz-border-image":{"_aliasOf":"border-image"},"-o-border-image":{"_aliasOf":"border-image"},"-webkit-border-image-slice":{"_aliasOf":"border-image-slice"},"-moz-border-end-color":{"_aliasOf":"border-inline-end-color"},"-moz-border-end-style":{"_aliasOf":"border-inline-end-style"},"-moz-border-end-width":{"_aliasOf":"border-inline-end-width"},"-moz-border-start-color":{"_aliasOf":"border-inline-start-color"},"-moz-border-start-style":{"_aliasOf":"border-inline-start-style"},"-webkit-border-radius":{"_aliasOf":"border-radius"},"-moz-border-radius":{"_aliasOf":"border-radius"},"-webkit-border-top-left-radius":{"_aliasOf":"border-top-left-radius"},"-moz-border-radius-topleft":{"_aliasOf":"border-top-left-radius"},"-webkit-border-top-right-radius":{"_aliasOf":"border-top-right-radius"},"-moz-border-radius-topright":{"_aliasOf":"border-top-right-radius"},"-webkit-box-align":{"_aliasOf":"box-align"},"-moz-box-align":{"_aliasOf":"box-align"},"-khtml-box-align":{"_aliasOf":"box-align"},"-webkit-box-decoration-break":{"_aliasOf":"box-decoration-break"},"-webkit-box-direction":{"_aliasOf":"box-direction"},"-moz-box-direction":{"_aliasOf":"box-direction"},"-khtml-box-direction":{"_aliasOf":"box-direction"},"-webkit-box-flex":{"_aliasOf":"box-flex"},"-moz-box-flex":{"_aliasOf":"box-flex"},"-khtml-box-flex":{"_aliasOf":"box-flex"},"-webkit-box-flex-group":{"_aliasOf":"box-flex-group"},"-khtml-box-flex-group":{"_aliasOf":"box-flex-group"},"-webkit-box-lines":{"_aliasOf":"box-lines"},"-khtml-box-lines":{"_aliasOf":"box-lines"},"-webkit-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-moz-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-khtml-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-webkit-box-orient":{"_aliasOf":"box-orient"},"-moz-box-orient":{"_aliasOf":"box-orient"},"-khtml-box-orient":{"_aliasOf":"box-orient"},"-webkit-box-pack":{"_aliasOf":"box-pack"},"-moz-box-pack":{"_aliasOf":"box-pack"},"-khtml-box-pack":{"_aliasOf":"box-pack"},"-webkit-box-shadow":{"_aliasOf":"box-shadow"},"-moz-box-shadow":{"_aliasOf":"box-shadow"},"-webkit-box-sizing":{"_aliasOf":"box-sizing"},"-moz-box-sizing":{"_aliasOf":"box-sizing"},"-webkit-clip-path":{"_aliasOf":"clip-path"},"-webkit-column-count":{"_aliasOf":"column-count"},"-moz-column-count":{"_aliasOf":"column-count"},"-moz-column-fill":{"_aliasOf":"column-fill"},"-webkit-column-fill":{"_aliasOf":"column-fill"},"-webkit-column-rule":{"_aliasOf":"column-rule"},"-moz-column-rule":{"_aliasOf":"column-rule"},"-webkit-column-rule-color":{"_aliasOf":"column-rule-color"},"-moz-column-rule-color":{"_aliasOf":"column-rule-color"},"-webkit-column-rule-style":{"_aliasOf":"column-rule-style"},"-moz-column-rule-style":{"_aliasOf":"column-rule-style"},"-webkit-column-rule-width":{"_aliasOf":"column-rule-width"},"-moz-column-rule-width":{"_aliasOf":"column-rule-width"},"-webkit-column-span":{"_aliasOf":"column-span"},"-webkit-column-width":{"_aliasOf":"column-width"},"-moz-column-width":{"_aliasOf":"column-width"},"-webkit-columns":{"_aliasOf":"columns"},"-moz-columns":{"_aliasOf":"columns"},"-webkit-filter":{"_aliasOf":"filter"},"-webkit-flex":{"_aliasOf":"flex"},"-ms-flex":{"_aliasOf":"flex"},"-webkit-flex-basis":{"_aliasOf":"flex-basis"},"-webkit-flex-direction":{"_aliasOf":"flex-direction"},"-ms-flex-direction":{"_aliasOf":"flex-direction"},"-webkit-flex-flow":{"_aliasOf":"flex-flow"},"-webkit-flex-grow":{"_aliasOf":"flex-grow"},"-ms-flex-positive":{"_aliasOf":"flex-grow"},"-webkit-flex-shrink":{"_aliasOf":"flex-shrink"},"-webkit-flex-wrap":{"_aliasOf":"flex-wrap"},"-webkit-font-feature-settings":{"_aliasOf":"font-feature-settings"},"-moz-font-feature-settings":{"_aliasOf":"font-feature-settings"},"-webkit-font-kerning":{"_aliasOf":"font-kerning"},"-moz-font-language-override":{"_aliasOf":"font-language-override"},"-webkit-font-smoothing":{"_aliasOf":"font-smooth"},"-moz-osx-font-smoothing":{"_aliasOf":"font-smooth"},"-webkit-font-variant-ligatures":{"_aliasOf":"font-variant-ligatures"},"-ms-high-contrast-adjust":{"_aliasOf":"forced-color-adjust"},"-ms-grid-columns":{"_aliasOf":"grid-template-columns"},"-ms-grid-rows":{"_aliasOf":"grid-template-rows"},"-webkit-hyphenate-character":{"_aliasOf":"hyphenate-character"},"-webkit-hyphens":{"_aliasOf":"hyphens"},"-ms-hyphens":{"_aliasOf":"hyphens"},"-moz-hyphens":{"_aliasOf":"hyphens"},"-ms-ime-mode":{"_aliasOf":"ime-mode"},"-webkit-initial-letter":{"_aliasOf":"initial-letter"},"offset-block":{"_aliasOf":"inset-block"},"offset-block-end":{"_aliasOf":"inset-block-end"},"offset-block-start":{"_aliasOf":"inset-block-start"},"offset-inline":{"_aliasOf":"inset-inline"},"offset-inline-end":{"_aliasOf":"inset-inline-end"},"offset-inline-start":{"_aliasOf":"inset-inline-start"},"-webkit-justify-content":{"_aliasOf":"justify-content"},"-webkit-line-break":{"_aliasOf":"line-break"},"-ms-line-break":{"_aliasOf":"line-break"},"-khtml-line-break":{"_aliasOf":"line-break"},"-webkit-line-clamp":{"_aliasOf":"line-clamp"},"-webkit-margin-end":{"_aliasOf":"margin-inline-end"},"-moz-margin-end":{"_aliasOf":"margin-inline-end"},"-webkit-margin-start":{"_aliasOf":"margin-inline-start"},"-moz-margin-start":{"_aliasOf":"margin-inline-start"},"-webkit-mask":{"_aliasOf":"mask"},"-webkit-mask-box-image-outset":{"_aliasOf":"mask-border-outset"},"-webkit-mask-box-image-repeat":{"_aliasOf":"mask-border-repeat"},"-webkit-mask-box-image-slice":{"_aliasOf":"mask-border-slice"},"-webkit-mask-box-image-source":{"_aliasOf":"mask-border-source"},"-webkit-mask-box-image-width":{"_aliasOf":"mask-border-width"},"-webkit-mask-clip":{"_aliasOf":"mask-clip"},"-webkit-mask-image":{"_aliasOf":"mask-image"},"-webkit-mask-origin":{"_aliasOf":"mask-origin"},"-webkit-mask-position":{"_aliasOf":"mask-position"},"-webkit-mask-repeat":{"_aliasOf":"mask-repeat"},"-webkit-mask-size":{"_aliasOf":"mask-size"},"-webkit-max-inline-size":{"_aliasOf":"max-inline-size"},"-o-object-fit":{"_aliasOf":"object-fit"},"-o-object-position":{"_aliasOf":"object-position"},"motion":{"_aliasOf":"offset"},"motion-distance":{"_aliasOf":"offset-distance"},"motion-path":{"_aliasOf":"offset-path"},"offset-rotation":{"_aliasOf":"offset-rotate"},"motion-rotation":{"_aliasOf":"offset-rotate"},"-moz-opacity":{"_aliasOf":"opacity"},"-khtml-opacity":{"_aliasOf":"opacity"},"-webkit-order":{"_aliasOf":"order"},"-ms-order":{"_aliasOf":"order"},"-moz-outline":{"_aliasOf":"outline"},"-moz-outline-color":{"_aliasOf":"outline-color"},"-moz-outline-style":{"_aliasOf":"outline-style"},"-moz-outline-width":{"_aliasOf":"outline-width"},"word-wrap":{"_aliasOf":"overflow-wrap"},"-ms-overflow-x":{"_aliasOf":"overflow-x"},"-ms-overflow-y":{"_aliasOf":"overflow-y"},"-webkit-padding-end":{"_aliasOf":"padding-inline-end"},"-moz-padding-end":{"_aliasOf":"padding-inline-end"},"-webkit-padding-start":{"_aliasOf":"padding-inline-start"},"-moz-padding-start":{"_aliasOf":"padding-inline-start"},"-webkit-perspective":{"_aliasOf":"perspective"},"-moz-perspective":{"_aliasOf":"perspective"},"-webkit-perspective-origin":{"_aliasOf":"perspective-origin"},"-moz-perspective-origin":{"_aliasOf":"perspective-origin"},"inset-area":{"_aliasOf":"position-area"},"position-try-options":{"_aliasOf":"position-try-fallbacks"},"-webkit-print-color-adjust":{"_aliasOf":"print-color-adjust"},"-webkit-ruby-position":{"_aliasOf":"ruby-position"},"scroll-snap-margin":{"_aliasOf":"scroll-margin"},"scroll-snap-margin-bottom":{"_aliasOf":"scroll-margin-bottom"},"scroll-snap-margin-left":{"_aliasOf":"scroll-margin-left"},"scroll-snap-margin-right":{"_aliasOf":"scroll-margin-right"},"scroll-snap-margin-top":{"_aliasOf":"scroll-margin-top"},"-ms-scroll-snap-type":{"_aliasOf":"scroll-snap-type"},"-webkit-scroll-snap-type":{"_aliasOf":"scroll-snap-type"},"-webkit-shape-margin":{"_aliasOf":"shape-margin"},"-moz-tab-size":{"_aliasOf":"tab-size"},"-o-tab-size":{"_aliasOf":"tab-size"},"-moz-text-align-last":{"_aliasOf":"text-align-last"},"-ms-text-combine-horizontal":{"_aliasOf":"text-combine-upright"},"-moz-text-decoration-color":{"_aliasOf":"text-decoration-color"},"-webkit-text-decoration-color":{"_aliasOf":"text-decoration-color"},"-moz-text-decoration-line":{"_aliasOf":"text-decoration-line"},"-webkit-text-decoration-line":{"_aliasOf":"text-decoration-line"},"-webkit-text-decoration-skip":{"_aliasOf":"text-decoration-skip"},"-moz-text-decoration-style":{"_aliasOf":"text-decoration-style"},"-webkit-text-decoration-style":{"_aliasOf":"text-decoration-style"},"-webkit-text-emphasis":{"_aliasOf":"text-emphasis"},"-webkit-text-emphasis-color":{"_aliasOf":"text-emphasis-color"},"-webkit-text-emphasis-position":{"_aliasOf":"text-emphasis-position"},"-webkit-text-emphasis-style":{"_aliasOf":"text-emphasis-style"},"-webkit-text-orientation":{"_aliasOf":"text-orientation"},"-ms-text-overflow":{"_aliasOf":"text-overflow"},"-o-text-overflow":{"_aliasOf":"text-overflow"},"-webkit-text-size-adjust":{"_aliasOf":"text-size-adjust"},"-moz-text-size-adjust":{"_aliasOf":"text-size-adjust"},"-webkit-text-underline-position":{"_aliasOf":"text-underline-position"},"-ms-touch-action":{"_aliasOf":"touch-action"},"-webkit-transform":{"_aliasOf":"transform"},"-moz-transform":{"_aliasOf":"transform"},"-ms-transform":{"_aliasOf":"transform"},"-o-transform":{"_aliasOf":"transform"},"-webkit-transform-origin":{"_aliasOf":"transform-origin"},"-moz-transform-origin":{"_aliasOf":"transform-origin"},"-ms-transform-origin":{"_aliasOf":"transform-origin"},"-o-transform-origin":{"_aliasOf":"transform-origin"},"-webkit-transform-style":{"_aliasOf":"transform-style"},"-moz-transform-style":{"_aliasOf":"transform-style"},"-webkit-transition":{"_aliasOf":"transition"},"-moz-transition":{"_aliasOf":"transition"},"-ms-transition":{"_aliasOf":"transition"},"-o-transition":{"_aliasOf":"transition"},"-webkit-transition-delay":{"_aliasOf":"transition-delay"},"-moz-transition-delay":{"_aliasOf":"transition-delay"},"-ms-transition-delay":{"_aliasOf":"transition-delay"},"-o-transition-delay":{"_aliasOf":"transition-delay"},"-webkit-transition-duration":{"_aliasOf":"transition-duration"},"-moz-transition-duration":{"_aliasOf":"transition-duration"},"-ms-transition-duration":{"_aliasOf":"transition-duration"},"-o-transition-duration":{"_aliasOf":"transition-duration"},"-webkit-transition-property":{"_aliasOf":"transition-property"},"-moz-transition-property":{"_aliasOf":"transition-property"},"-ms-transition-property":{"_aliasOf":"transition-property"},"-o-transition-property":{"_aliasOf":"transition-property"},"-webkit-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-moz-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-ms-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-o-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-webkit-user-modify":{"_aliasOf":"user-modify"},"-moz-user-modify":{"_aliasOf":"user-modify"},"-khtml-user-modify":{"_aliasOf":"user-modify"},"-webkit-user-select":{"_aliasOf":"user-select"},"-ms-user-select":{"_aliasOf":"user-select"},"-moz-user-select":{"_aliasOf":"user-select"},"-khtml-user-select":{"_aliasOf":"user-select"},"-ms-word-break":{"_aliasOf":"word-break"},"-webkit-writing-mode":{"_aliasOf":"writing-mode"},"-ms-writing-mode":{"_aliasOf":"writing-mode"}} \ No newline at end of file +{"-moz-float-edge":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-force-broken-image-icon":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-image-region":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-image-region","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"111","added":1,"removed":112}],"firefox_android":[{"version_last":"111","added":4,"removed":112}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-orient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-orient","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"inline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"-moz-user-focus":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"121","added":1,"removed":122}],"firefox_android":[{"version_last":"121","added":4,"removed":122}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-user-input":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-user-input","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"auto":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"none":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"-webkit-app-region":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-webkit-border-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-border-horizontal-spacing":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-border-vertical-spacing":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-box-reflect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-axis":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"34","added":17,"removed":35}],"chrome_android":[{"version_last":"34","added":18,"removed":35}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-column-break-after":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-break-before":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-break-inside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-progression":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"34","added":22,"removed":35}],"chrome_android":[{"version_last":"34","added":25,"removed":35}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-cursor-visibility":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-hyphenate-limit-after":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":11,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-hyphenate-limit-before":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":11,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-hyphenate-limit-lines":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":16,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-align":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":19,"removed":34}],"chrome_android":[{"version_last":"33","added":25,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-box-contain":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"46","added":12,"removed":47}],"chrome_android":[{"version_last":"46","added":18,"removed":47}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-line-grid":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":17,"removed":34}],"chrome_android":[{"version_last":"33","added":18,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-snap":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":19,"removed":34}],"chrome_android":[{"version_last":"33","added":25,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-locale":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-logical-height":{"_aliasOf":"block-size"},"-webkit-logical-width":{"_aliasOf":"inline-size"},"-webkit-margin-after":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-margin-before":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-mask-box-image":{"_aliasOf":"mask-border"},"-webkit-mask-composite":{"_aliasOf":"mask-composite"},"-webkit-mask-position-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]}}},"-webkit-mask-position-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]}}},"-webkit-mask-repeat-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"119","added":3,"removed":120}],"chrome_android":[{"version_last":"119","added":18,"removed":120}],"edge":[{"version_last":"119","added":79,"removed":120}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"14.1","added":5,"removed":15}],"safari_ios":[{"version_last":"14.5","added":5,"removed":15}]}}},"-webkit-mask-repeat-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"119","added":3,"removed":120}],"chrome_android":[{"version_last":"119","added":18,"removed":120}],"edge":[{"version_last":"119","added":79,"removed":120}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"14.1","added":5,"removed":15}],"safari_ios":[{"version_last":"14.5","added":5,"removed":15}]}}},"-webkit-mask-source-type":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-max-logical-height":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-max-logical-width":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-min-logical-height":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-min-logical-width":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-nbsp-mode":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"27","added":1,"removed":28}],"chrome_android":[{"version_last":"27","added":18,"removed":28}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-perspective-origin-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-perspective-origin-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-rtl-ordering":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-tap-highlight-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":4}]}}},"-webkit-text-combine":{"_aliasOf":"text-combine-upright"},"-webkit-text-decorations-in-effect":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"13","added":4,"removed":13.1}],"safari_ios":[{"version_last":"13","added":3.2,"removed":13.4}]}}},"-webkit-text-fill-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-fill-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-security":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-security","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":114}],"firefox_android":[{"added":114}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]}}},"-webkit-text-stroke":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-stroke-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-stroke-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-zoom":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]}}},"-webkit-touch-callout":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":2}]}}},"-webkit-transform-origin-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-transform-origin-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-transform-origin-z":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-user-drag":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"accent-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/accent-color","spec_url":"https://drafts.csswg.org/css-ui/#widget-accent","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:accent-color"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:accent-color"]}},"maintains_contrast":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#:~:text=must%20maintain%20contrast%20for%20legibility%20of%20the%20control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"impl_url":"https://crbug.com/343503163","added":false}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/244233","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/244233","added":false}]},"tags":["web-features:accent-color"]}}},"align-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-content","spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#align-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":28},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":28},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"block_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#align-justify-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:align-content-block"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#align-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/41344054","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/41344054","added":false}],"edge":[{"impl_url":"https://crbug.com/41344054","added":false}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":11}],"safari_ios":[{"partial_implementation":true,"added":11}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"space-evenly":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.6}],"safari_ios":[{"added":15.6}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-grid/#grid-align"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-multicol/#the-multi-column-model"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:multi-column"]}},"_aliasOf":"align-content"},"align-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-items","spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52},{"partial_implementation":true,"version_last":"51","added":21,"removed":52}],"chrome_android":[{"added":52},{"partial_implementation":true,"version_last":"51","added":25,"removed":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":108}],"chrome_android":[{"added":108}],"edge":[{"added":108}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"_aliasOf":"align-items"},"align-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-self","spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"partial_implementation":true,"version_last":"35","added":21,"removed":36}],"chrome_android":[{"added":36},{"partial_implementation":true,"version_last":"35","added":25,"removed":36}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":108}],"chrome_android":[{"added":108}],"edge":[{"added":108}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#align-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}},"_aliasOf":"align-self","-ms-grid_context":{"_aliasOf":"grid_context"}},"alignment-baseline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/alignment-baseline","spec_url":["https://drafts.csswg.org/css-inline/#alignment-baseline-property","https://svgwg.org/svg2-draft/text.html#AlignmentBaselineProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]},"alphabetic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"central":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"ideographic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"mathematical":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"middle":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}}},"all":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/all","spec_url":"https://drafts.csswg.org/css-cascade/#all-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":27}],"firefox_android":[{"added":27}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:all"]}},"alt":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"17.6","added":9,"removed":18},{"prefix":"-webkit-","version_last":"17.6","added":8,"removed":18}],"safari_ios":[{"version_last":"17.6","added":9,"removed":18},{"prefix":"-webkit-","version_last":"17.6","added":8,"removed":18}]}},"_aliasOf":"alt"},"anchor-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/anchor-name","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-name-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"anchor-scope":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#propdef-anchor-scope","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-scope-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-scope-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"animation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation","spec_url":"https://drafts.csswg.org/css-animations/#animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"animation-timeline_included":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":115}],"chrome_android":[{"partial_implementation":true,"added":115}],"edge":[{"partial_implementation":true,"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-driven-animations"]}},"_aliasOf":"animation"},"animation-composition":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-composition","spec_url":"https://drafts.csswg.org/css-animations-2/#animation-composition","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:animation-composition"]}},"animation-delay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-delay","spec_url":"https://drafts.csswg.org/css-animations/#animation-delay","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"_aliasOf":"animation-delay"},"animation-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-direction","spec_url":"https://drafts.csswg.org/css-animations/#animation-direction","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"alternate":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-alternate","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"alternate-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-alternate-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:animations-css"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-direction"},"animation-duration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-duration","spec_url":"https://drafts.csswg.org/css-animations/#animation-duration","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"partial_implementation":true,"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:animations-css"]},"auto":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-duration#Values","spec_url":"https://drafts.csswg.org/css-animations-2/#valdef-animation-duration-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-duration"},"animation-fill-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode","spec_url":"https://drafts.csswg.org/css-animations/#animation-fill-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":5}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":4}]},"tags":["web-features:animations-css"]},"backwards":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-backwards","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"forwards":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-forwards","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-fill-mode"},"animation-iteration-count":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count","spec_url":"https://drafts.csswg.org/css-animations/#animation-iteration-count","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"infinite":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-iteration-count-infinite","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-iteration-count"},"animation-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-name","spec_url":"https://drafts.csswg.org/css-animations/#animation-name","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-name"},"animation-play-state":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-play-state","spec_url":"https://drafts.csswg.org/css-animations/#animation-play-state","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:animations-css"]},"paused":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-play-state-paused","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"running":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-play-state-running","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-play-state"},"animation-range":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"animation-range-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range-end","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-animation-range-end-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-range-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range-start","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-animation-range-start-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline","spec_url":"https://drafts.csswg.org/css-animations-2/#animation-timeline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":110}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"scroll":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline/scroll","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":110}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline/view","spec_url":"https://drafts.csswg.org/scroll-animations/#view-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-timing-function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timing-function","spec_url":["https://drafts.csswg.org/css-animations/#animation-timing-function","https://drafts.csswg.org/css-easing/#linear-easing-function-parsin"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"jump":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":14}],"safari_ios":[{"added":14}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-timing-function"},"appearance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/appearance","spec_url":"https://drafts.csswg.org/css-ui/#appearance-switching","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":84},{"prefix":"-webkit-","added":18}],"edge":[{"added":84},{"prefix":"-webkit-","added":12}],"firefox":[{"added":80},{"prefix":"-webkit-","added":64},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":80},{"prefix":"-webkit-","added":64},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":1}]},"tags":["web-features:appearance"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":80}],"firefox_android":[{"added":80}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:appearance"]}},"base-select":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":134}],"chrome_android":[{"added":134}],"edge":[{"added":134}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:customizable-select"]}},"button":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-button","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"checkbox":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-checkbox","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"listbox":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-listbox","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"menulist":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-menulist","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"menulist-button":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-menulist-button","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":80},{"partial_implementation":true,"added":1}],"firefox_android":[{"added":80},{"partial_implementation":true,"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:appearance"]}},"meter":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-meter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":54},{"partial_implementation":true,"added":1}],"firefox_android":[{"added":54},{"partial_implementation":true,"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":3}]},"tags":["web-features:appearance"]}},"progress-bar":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-progress-bar","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"radio":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-radio","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"searchfield":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-searchfield","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"textarea":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-textarea","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"textfield":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-textfield","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:appearance"]}},"_aliasOf":"appearance"},"aspect-ratio":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/aspect-ratio","spec_url":"https://drafts.csswg.org/css-sizing-4/#aspect-ratio","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":89}],"firefox_android":[{"added":89}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:aspect-ratio"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-aspect-ratio-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":89}],"firefox_android":[{"added":89}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:aspect-ratio"]}}},"backdrop-filter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/backdrop-filter","spec_url":"https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":76}],"chrome_android":[{"added":76}],"edge":[{"added":79},{"prefix":"-webkit-","version_last":"18","added":17,"removed":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":18},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":18},{"prefix":"-webkit-","added":9}]},"tags":["web-features:backdrop-filter"]},"_aliasOf":"backdrop-filter"},"backface-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/backface-visibility","spec_url":"https://drafts.csswg.org/css-transforms-2/#backface-visibility-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":5}]},"tags":["web-features:transforms3d"]},"_aliasOf":"backface-visibility"},"background":{"SVG_image_as_background":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3.1}],"safari_ios":[{"added":1}]},"tags":["web-features:svg"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background"]},"background-clip":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-clip"]}},"background-origin":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-origin"]}},"background-size":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":9}],"firefox_android":[{"added":18}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-size"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background"]}}},"background-attachment":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-attachment","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-attachment","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-fixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":2}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":14,"removed":15.4},{"version_last":"13.1","added":3.1,"removed":14}],"safari_ios":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":5,"removed":15.4}]},"tags":["web-features:background-attachment"]}},"local":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-local","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":25}],"firefox_android":[{"added":25}],"ie":[{"added":9}],"safari":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":13,"removed":15.4},{"version_last":"12.1","added":5,"removed":13}],"safari_ios":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":13,"removed":15.4},{"version_last":"12.2","added":4.2,"removed":13}]},"tags":["web-features:background-attachment"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]}}},"background-blend-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-blend-mode","spec_url":"https://drafts.fxtf.org/compositing/#background-blend-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":35}],"chrome_android":[{"added":35}],"edge":[{"added":79}],"firefox":[{"added":30}],"firefox_android":[{"added":30}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-blend-mode"]}},"background-clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-clip","spec_url":["https://drafts.csswg.org/css-backgrounds/#background-clip","https://drafts.csswg.org/css-backgrounds-4/#background-clip"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"partial_implementation":true,"prefix":"-moz-","version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":5},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-clip"]},"border-area":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-4/#valdef-background-clip-border-area","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:background-clip-border-area"]}},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-clip"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-clip"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-clip"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-4/#valdef-background-clip-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"partial_implementation":true,"added":3}],"chrome_android":[{"added":120},{"partial_implementation":true,"added":18}],"edge":[{"added":120},{"partial_implementation":true,"added":79},{"version_last":"18","added":15,"removed":79},{"partial_implementation":true,"version_last":"14","added":12,"removed":15}],"firefox":[{"partial_implementation":true,"added":49}],"firefox_android":[{"partial_implementation":true,"added":49}],"ie":[{"added":false}],"safari":[{"added":14},{"partial_implementation":true,"added":4}],"safari_ios":[{"added":14},{"partial_implementation":true,"added":3.2}]},"tags":["web-features:background-clip-text"]}},"_aliasOf":"background-clip"},"background-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-color"]}},"background-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-image","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]},"element":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/element","spec_url":"https://drafts.csswg.org/css-images-4/#element-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"prefix":"-moz-","added":4}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:element"]},"_aliasOf":"element"},"gradients":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images-4/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:gradients"]}},"image-rect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-image-rect","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"prefix":"-moz-","version_last":"119","added":4,"removed":120}],"firefox_android":[{"prefix":"-moz-","version_last":"119","added":4,"removed":120}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"_aliasOf":"image-rect"},"image-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image/image-set","spec_url":"https://drafts.csswg.org/css-images-4/#image-set-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":20,"removed":113}],"chrome_android":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":25,"removed":113}],"edge":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":79,"removed":113}],"firefox":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"firefox_android":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.1","added":10.1,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.1","added":6,"removed":14}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.4","added":10.3,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.4","added":6,"removed":14}]},"tags":["web-features:image-set"]},"_aliasOf":"image-set"},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-image-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]}},"svg_images":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}},"-moz-element":{"_aliasOf":"element"},"-moz-image-rect":{"_aliasOf":"image-rect"},"-webkit-image-set":{"_aliasOf":"image-set"}},"background-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-origin","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-origin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"partial_implementation":true,"prefix":"-moz-","version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":3},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":1},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-origin"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-origin"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-origin"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-origin"]}},"_aliasOf":"background-origin"},"background-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":9}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:background-position"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}}},"background-position-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position-x","spec_url":"https://drafts.csswg.org/css-backgrounds-4/#background-position-longhands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:background-position"]}}},"background-position-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position-y","spec_url":"https://drafts.csswg.org/css-backgrounds-4/#background-position-longhands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:background-position"]}}},"background-repeat":{"2-value":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4}]},"tags":["web-features:background-repeat"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-repeat","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"no-repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-no-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat-x":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat-x","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat-y":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat-y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"round":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-repeat"]}},"space":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-space","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-repeat"]}}},"background-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-size","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"3.6","added":3.6,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-size"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-size"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:background-size"]}},"cover":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-cover","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:background-size"]}},"_aliasOf":"background-size"},"baseline-shift":{"__compat":{"spec_url":["https://drafts.csswg.org/css-inline/#baseline-shift-property","https://svgwg.org/svg2-draft/text.html#BaselineShiftProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:baseline-shift"]},"baseline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-baseline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:baseline-shift"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:baseline-shift"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:baseline-shift"]}}},"baseline-source":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#baseline-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}},"first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-first","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}},"last":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-last","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}}},"block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/block-size","spec_url":["https://drafts.csswg.org/css-logical/#dimension-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57},{"alternative_name":"-webkit-logical-height","added":8}],"chrome_android":[{"added":57},{"alternative_name":"-webkit-logical-height","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-logical-height","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-logical-height","added":5.1}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-logical-height","added":5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"block-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"border":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border","spec_url":"https://drafts.csswg.org/css-backgrounds/#propdef-border","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-color","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-style","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-width","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-left-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomleft","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomleft","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-bottom-left-radius"},"border-bottom-right-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomright","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomright","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-bottom-right-radius"},"border-bottom-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-collapse":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-collapse","spec_url":"https://drafts.csswg.org/css2/#propdef-border-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]},"collapse":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"separate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}}},"border-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-color","spec_url":["https://drafts.csswg.org/css-logical/#logical-shorthand-keyword","https://drafts.csswg.org/css-backgrounds/#border-color"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-end-end-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-end-start-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16},{"prefix":"-webkit-","added":7}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":15},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":15},{"prefix":"-moz-","added":4}],"ie":[{"added":11}],"safari":[{"added":6},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":6},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:border-image"]},"fill":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"gradient":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":7}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":29}],"firefox_android":[{"added":29}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:border-image"]}},"optional_border_image_slice":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"_aliasOf":"border-image"},"border-image-outset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-outset","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"border-image-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-repeat","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]},"repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"round":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"space":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-space","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":12}],"firefox":[{"added":50}],"firefox_android":[{"added":50}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}}},"border-image-slice":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-slice","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]},"_aliasOf":"border-image-slice"},"border-image-source":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-source","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"border-image-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-width-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}}},"border-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-color","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-end-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-color","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-color","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-color"},"border-inline-end-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-style","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-style","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-style"},"border-inline-end-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-width","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-width","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-width"},"border-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-start-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-start-color","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-start-color","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-start-color"},"border-inline-start-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-start-style","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-start-style","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-start-style"},"border-inline-start-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-style","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-width","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-radius":{"4_values_for_4_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-moz-","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-moz-","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_borders":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-radius"},"border-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-spacing","spec_url":"https://drafts.csswg.org/css2/#separated-borders","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"border-start-end-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-start-start-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]},"dashed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-dashed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"dotted":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-dotted","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"double":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-double","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"groove":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-groove","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"inset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-inset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"outset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"ridge":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-ridge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"solid":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-solid","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}}},"border-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-left-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topleft","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topleft","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-top-left-radius"},"border-top-right-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topright","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topright","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-top-right-radius"},"border-top-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3}]},"tags":["web-features:borders"]}},"bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/bottom","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"box-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-align","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-align"},"box-decoration-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-decoration-break","spec_url":"https://drafts.csswg.org/css-break/#break-decoration","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":25}],"edge":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"prefix":"-webkit-","added":7}],"safari_ios":[{"partial_implementation":true,"prefix":"-webkit-","added":7}]},"tags":["web-features:box-decoration-break"]},"clone":{"__compat":{"spec_url":"https://drafts.csswg.org/css-break/#valdef-box-decoration-break-clone","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"added":25}],"edge":[{"added":130},{"partial_implementation":true,"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:box-decoration-break"]}},"slice":{"__compat":{"spec_url":"https://drafts.csswg.org/css-break/#valdef-box-decoration-break-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"added":25}],"edge":[{"added":130},{"partial_implementation":true,"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:box-decoration-break"]}},"_aliasOf":"box-decoration-break"},"box-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-direction","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-direction"},"box-flex":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-flex","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-flex"},"box-flex-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-flex-group","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","version_last":"66","added":1,"removed":67}],"chrome_android":[{"prefix":"-webkit-","version_last":"66","added":18,"removed":67}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-flex-group"},"box-lines":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-lines","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","version_last":"66","added":1,"removed":67}],"chrome_android":[{"prefix":"-webkit-","version_last":"66","added":18,"removed":67}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-lines"},"box-ordinal-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-ordinal-group"},"box-orient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-orient","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-orient"},"box-pack":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-pack","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-pack"},"box-shadow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-shadow","spec_url":"https://drafts.csswg.org/css-backgrounds/#box-shadow","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":10},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"12","added":3.5,"removed":13}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5.1},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":5},{"prefix":"-webkit-","added":1}]},"tags":["web-features:box-shadow"]},"inset":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"partial_implementation":true,"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:box-shadow"]}},"multiple_shadows":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:box-shadow"]}},"spread_radius":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:box-shadow"]}},"_aliasOf":"box-shadow"},"box-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-sizing","spec_url":"https://drafts.csswg.org/css-sizing/#box-sizing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":10},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":29},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":29},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":8}],"safari":[{"added":5.1},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":6},{"prefix":"-webkit-","added":1}]},"tags":["web-features:box-sizing"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-box-sizing-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:box-sizing"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-box-sizing-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:box-sizing"]}},"_aliasOf":"box-sizing"},"break-after":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-after","spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40438447","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40438447","added":false}],"edge":[{"impl_url":"https://crbug.com/40438447","added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"verso":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}}},"break-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-before","spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":51}],"chrome_android":[{"added":51}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40438447","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40438447","added":false}],"edge":[{"impl_url":"https://crbug.com/40438447","added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"verso":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}}},"break-inside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-inside","spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":51}],"chrome_android":[{"added":51}],"edge":[{"added":12}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}}},"caption-side":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/caption-side","spec_url":["https://drafts.csswg.org/css2/#propdef-caption-side","https://drafts.csswg.org/css-logical/#caption-side"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]},"bottom":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"bottom-outside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"version_last":"16.6","added":1,"removed":17}],"safari_ios":[{"version_last":"16.6","added":1,"removed":17}]}}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"version_last":"16.6","added":1,"removed":17}],"safari_ios":[{"version_last":"16.6","added":1,"removed":17}]}}},"top":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"top-outside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}},"writing-mode_relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":42}],"firefox_android":[{"added":42}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}}},"caret-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/caret-color","spec_url":"https://drafts.csswg.org/css-ui/#caret-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:caret-color"]}},"clear":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clear","spec_url":["https://drafts.csswg.org/css2/#propdef-clear","https://drafts.csswg.org/css-logical/#float-clear"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}}},"clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip","spec_url":"https://drafts.fxtf.org/css-masking/#clip-property","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:clip"]},"auto":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:clip"]}}},"clip-path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip-path","spec_url":"https://drafts.fxtf.org/css-masking/#the-clip-path","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"prefix":"-webkit-","added":23}],"chrome_android":[{"added":55},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"partial_implementation":true,"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"partial_implementation":true,"added":10}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":7}]},"tags":["web-features:clip-path"]},"basic_shape":{"__compat":{"spec_url":"https://drafts.csswg.org/css-shapes/#typedef-basic-shape","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":54}],"firefox_android":[{"added":54}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":51}],"firefox_android":[{"added":51}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"html_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"is_animatable":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:clip-path-animatable"]}},"path":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1},{"prefix":"-webkit-","added":10}],"safari_ios":[{"added":13},{"prefix":"-webkit-","added":10}]},"tags":["web-features:clip-path"]},"_aliasOf":"path"},"stroke-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":51}],"firefox_android":[{"added":51}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":10}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"view-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":54}],"firefox_android":[{"added":54}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"_aliasOf":"clip-path","-webkit-path":{"_aliasOf":"path"}},"clip-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip-rule","spec_url":"https://drafts.fxtf.org/css-masking/#the-clip-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]},"evenodd":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking-1/#valdef-clip-rule-evenodd","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}},"nonzero":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking-1/#valdef-clip-rule-nonzero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}}},"color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color","spec_url":["https://drafts.csswg.org/css-color/#the-color-property","https://svgwg.org/svg2-draft/painting.html#ColorProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:color"]}},"color-adjust":{"_aliasOf":"print-color-adjust"},"color-interpolation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-interpolation","spec_url":"https://svgwg.org/svg2-draft/painting.html#ColorInterpolationProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"linearGradient":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":123}],"firefox_android":[{"added":123}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"sRGB":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"color-interpolation-filters":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-interpolation-filters","spec_url":"https://drafts.fxtf.org/filter-effects/#ColorInterpolationFiltersProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:svg-filters"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:svg-filters"]}},"linearRGB":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-linearrgb","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg-filters"]}},"sRGB":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-srgb","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg-filters"]}}},"color-scheme":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-scheme","spec_url":"https://drafts.csswg.org/css-color-adjust/#color-scheme-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]},"dark":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"light":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"normal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"only_dark":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98},{"version_last":"84","added":81,"removed":85}],"chrome_android":[{"added":98},{"version_last":"84","added":81,"removed":85}],"edge":[{"added":98},{"version_last":"84","added":81,"removed":85}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"only_light":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98},{"version_last":"84","added":81,"removed":85}],"chrome_android":[{"added":98},{"version_last":"84","added":81,"removed":85}],"edge":[{"added":98},{"version_last":"84","added":81,"removed":85}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}}},"column-count":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-count","spec_url":"https://drafts.csswg.org/css-multicol/#cc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","version_last":"68","added":4,"removed":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:multi-column"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-count-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]}},"_aliasOf":"column-count"},"column-fill":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-fill","spec_url":"https://drafts.csswg.org/css-multicol/#cf","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":17,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","version_last":"68","added":17,"removed":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":8}]},"tags":["web-features:column-fill"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-fill-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":17}],"firefox_android":[{"added":17}],"ie":[{"added":11}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:column-fill"]}},"balance":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-fill-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":17}],"firefox_android":[{"added":17}],"ie":[{"added":11}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:column-fill"]}},"_aliasOf":"column-fill"},"column-gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-gap","spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-column-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-column-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-column-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-column-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-column-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-column-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-column-gap","added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":10},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":10},{"prefix":"-webkit-","added":3}]},"tags":["web-features:multi-column"]},"calc_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:multi-column"]}},"percentage_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":12}],"safari_ios":[{"added":12}]},"tags":["web-features:multi-column"]}},"_aliasOf":"multicol_context"},"grid-column-gap":{"_aliasOf":"grid_context"},"-webkit-multicol_context":{"_aliasOf":"multicol_context"},"-moz-multicol_context":{"_aliasOf":"multicol_context"}},"column-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule","spec_url":"https://drafts.csswg.org/css-multicol/#column-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule"},"column-rule-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-color","spec_url":"https://drafts.csswg.org/css-multicol/#crc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-color"},"column-rule-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-style","spec_url":"https://drafts.csswg.org/css-multicol/#crs","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-style"},"column-rule-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-width","spec_url":"https://drafts.csswg.org/css-multicol/#crw","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-width"},"column-span":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-span","spec_url":"https://drafts.csswg.org/css-multicol/#column-span","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":6}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":5}]},"tags":["web-features:column-span"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-span-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:column-span"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-span-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:column-span"]}},"_aliasOf":"column-span"},"column-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-width","spec_url":["https://drafts.csswg.org/css-sizing/#column-sizing","https://drafts.csswg.org/css-multicol/#cw"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":50},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]}},"_aliasOf":"column-width"},"columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/columns","spec_url":"https://drafts.csswg.org/css-multicol/#columns","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":9,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":22}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:multi-column"]},"_aliasOf":"columns"},"contain":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain","spec_url":"https://drafts.csswg.org/css-contain/#contain-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]},"content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain#inline-size","spec_url":"https://drafts.csswg.org/css-contain-2/#valdef-contain-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":101}],"firefox_android":[{"added":101}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:contain-inline-size"]}},"layout":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-layout","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-layout"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"paint":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-paint","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-paint"]}},"size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-size"]}},"strict":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-strict","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain#style","spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-style"]}}},"contain-intrinsic-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-block-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-block-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-height","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-height","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-inline-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"auto_none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-width","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"container":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"container-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container-name","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-name","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}}},"container-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container-type","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]},"inline-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"scroll-state":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-scroll-state","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:container-scroll-state-queries"]}},"size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}}},"content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/content","spec_url":"https://drafts.csswg.org/css-content/#content-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]},"alt_text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":128}],"firefox_android":[{"added":128}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:alt-text-generated-content"]}},"element_replacement":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:content"]}},"gradient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images-4/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26}],"chrome_android":[{"added":26}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":113}],"firefox_android":[{"partial_implementation":true,"added":113}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:content"]}},"image-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image/image-set","spec_url":"https://drafts.csswg.org/css-images-4/#image-set-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":20,"removed":113}],"chrome_android":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":25,"removed":113}],"edge":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":79,"removed":113}],"firefox":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"firefox_android":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.1","added":10.1,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.1","added":6,"removed":14}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.4","added":10.3,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.4","added":6,"removed":14}]},"tags":["web-features:image-set"]},"_aliasOf":"image-set"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-content-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"none_applies_to_elements":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.element-content-none.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:content"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-content-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"url":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/url_function","spec_url":"https://drafts.csswg.org/css-values/#urls","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"-webkit-image-set":{"_aliasOf":"image-set"}},"content-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/content-visibility","spec_url":"https://drafts.csswg.org/css-contain/#content-visibility","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/283846","partial_implementation":true,"added":18}],"safari_ios":[{"impl_url":"https://webkit.org/b/283846","partial_implementation":true,"added":18}]},"tags":["web-features:content-visibility"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]}},"is_transitionable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#content-visibility-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"keyframe_animatable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#content-visibility-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]}}},"counter-increment":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-increment","spec_url":"https://drafts.csswg.org/css-lists/#increment-set","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:counters"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:counters"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-set-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:counters"]}}},"counter-reset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-reset","spec_url":"https://drafts.csswg.org/css-lists/#counter-reset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:counters"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":28}],"chrome_android":[{"partial_implementation":true,"added":28}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"partial_implementation":true,"added":9}],"safari_ios":[{"partial_implementation":true,"added":9}]},"tags":["web-features:counters"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-reset-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:counters"]}},"reset_does_not_affect_siblings":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":82}],"firefox_android":[{"added":82}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:counters"]}},"reversed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#css-counter-reversed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:counter-reset-reversed"]}}},"counter-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-set","spec_url":"https://drafts.csswg.org/css-lists/#propdef-counter-set","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-set-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]}}},"cursor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cursor","spec_url":"https://drafts.csswg.org/css-ui/#cursor","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]},"alias":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-alias","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"all-scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-all-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"cell":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-cell","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"col-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-col-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"context-menu":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-context-menu","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"copy":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-copy","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"crosshair":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-crosshair","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"default":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-default","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"e-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-e-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ew-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ew-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"grab":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":68},{"prefix":"-webkit-","added":18}],"edge":[{"added":14}],"firefox":[{"added":27},{"prefix":"-moz-","added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"grab"},"grabbing":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-grabbing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":68},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":27}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"grabbing"},"help":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-help","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"move":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-move","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"n-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-n-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ne-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ne-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nesw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nesw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"no-drop":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-no-drop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":95}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"not-allowed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-not-allowed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ns-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ns-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nwse-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nwse-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"pointer":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-pointer","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"progress":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-progress","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"row-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-row-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"s-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-s-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"se-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-se-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"sw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-sw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"url":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"url_positioning_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"vertical-text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-vertical-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"w-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-w-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"wait":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-wait","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"zoom-in":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-zoom-in","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":37},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":24},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"zoom-in"},"zoom-out":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-zoom-out","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":37},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":24},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"zoom-out"},"-webkit-grab":{"_aliasOf":"grab"},"-moz-grab":{"_aliasOf":"grab"},"-webkit-grabbing":{"_aliasOf":"grabbing"},"-webkit-zoom-in":{"_aliasOf":"zoom-in"},"-moz-zoom-in":{"_aliasOf":"zoom-in"},"-webkit-zoom-out":{"_aliasOf":"zoom-out"},"-moz-zoom-out":{"_aliasOf":"zoom-out"}},"custom-property":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/--*","spec_url":"https://drafts.csswg.org/css-variables/#defining-variables","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":49}],"chrome_android":[{"added":49}],"edge":[{"added":15}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:custom-properties"]}},"cx":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cx","spec_url":"https://svgwg.org/svg2-draft/geometry.html#CX","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"cy":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cy","spec_url":"https://svgwg.org/svg2-draft/geometry.html#CY","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"d":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/d","spec_url":"https://svgwg.org/svg2-draft/paths.html#TheDProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/direction","spec_url":["https://drafts.csswg.org/css-writing-modes/#direction","https://svgwg.org/svg2-draft/text.html#DirectionProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]},"ltr":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-direction-ltr","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"rtl":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-direction-rtl","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"vertical_slider_direction":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":124}],"chrome_android":[{"added":124}],"edge":[{"added":124}],"firefox":[{"partial_implementation":true,"added":120}],"firefox_android":[{"partial_implementation":true,"added":120}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":16.5}],"safari_ios":[{"partial_implementation":true,"added":16.5}]},"tags":["web-features:vertical-form-controls"]}}},"display":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/display","spec_url":["https://drafts.csswg.org/css-display/#the-display-properties","https://svgwg.org/svg2-draft/render.html#VisibilityControl"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#typedef-display-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"contents":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-display-contents","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":65}],"chrome_android":[{"added":65}],"edge":[{"added":79}],"firefox":[{"added":37}],"firefox_android":[{"added":37}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:display-contents"]},"contents_unusual":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":65}],"chrome_android":[{"added":65}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-contents"]}},"focusable_elements":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40866683","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40866683","added":false}],"edge":[{"impl_url":"https://crbug.com/40866683","added":false}],"firefox":[{"impl_url":["https://bugzil.la/1791648","https://bugzil.la/1553549"],"added":false}],"firefox_android":[{"impl_url":["https://bugzil.la/1791648","https://bugzil.la/1553549"],"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/255149","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/255149","added":false}]},"tags":["web-features:display-contents"]}}},"flex":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"partial_implementation":true,"added":11},{"alternative_name":"-ms-flexbox","partial_implementation":true,"added":8}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex"},"flow-root":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":58}],"chrome_android":[{"added":58}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:display-flow-root"]}},"grid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"prefix":"-ms-","added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid"},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#typedef-display-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"inline-block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8},{"partial_implementation":true,"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"inline-flex":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11},{"alternative_name":"-ms-inline-flexbox","added":8}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"inline-flex"},"inline-grid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"prefix":"-ms-","added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"inline-grid"},"inline-table":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"is_transitionable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#display-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"keyframe_animatable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#display-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1834877","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1834877","added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"list-item":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/display-listitem","spec_url":"https://drafts.csswg.org/css-display/#typedef-display-listitem","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-list-item"]},"legend-support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-list-item"]}}},"math":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"multi-keyword_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:two-value-display"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-display-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]},"option_is_hidden":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display"]}}},"ruby":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-base":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-base-container":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-text-container":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"table":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:display-table"]}},"table-cell":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-column-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-footer-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-header-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-row":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-row-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"-webkit-flex":{"_aliasOf":"flex"},"-ms-flexbox":{"_aliasOf":"flex"},"-ms-grid":{"_aliasOf":"grid"},"-webkit-inline-flex":{"_aliasOf":"inline-flex"},"-ms-inline-flexbox":{"_aliasOf":"inline-flex"},"-ms-inline-grid":{"_aliasOf":"inline-grid"}},"dominant-baseline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/dominant-baseline","spec_url":["https://drafts.csswg.org/css-inline/#dominant-baseline-property","https://svgwg.org/svg2-draft/text.html#DominantBaselineProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]},"alphabetic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-alphabetic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"central":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-central","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"hanging":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-hanging","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"ideographic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-ideographic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"mathematical":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-mathematical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"middle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-middle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}}},"dynamic-range-limit":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#the-dynamic-range-limit-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"constrained":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-constrained","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"no-limit":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-no-limit","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"standard":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-standard","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"empty-cells":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/empty-cells","spec_url":"https://drafts.csswg.org/css2/#empty-cells","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"field-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/field-sizing","spec_url":"https://drafts.csswg.org/css-ui/#field-sizing","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]},"content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-field-sizing-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]}},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-field-sizing-fixed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]}}},"fill":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"fill-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill-opacity","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-opacity","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:opacity-svg"]}},"fill-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill-rule","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"evenodd":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-fill-rule-evenodd","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"nonzero":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-fill-rule-nonzero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}}},"filter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/filter","spec_url":"https://drafts.fxtf.org/filter-effects/#FilterProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":53},{"prefix":"-webkit-","added":18}],"chrome_android":[{"added":53}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":35},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":35},{"prefix":"-webkit-","added":49}],"ie":[{"added":false}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":6}]},"tags":["web-features:filter"]},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/246106","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/246106","added":false}]},"tags":["web-features:svg-filters"]}},"_aliasOf":"filter"},"flex":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex"},"flex-basis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-basis","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-basis-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":22},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":22},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":22}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"auto"},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":94},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"fit-content"},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":66},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":66},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"min-content"},"_aliasOf":"flex-basis","-webkit-auto":{"_aliasOf":"auto"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"flex-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-direction","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-direction-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"column":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-column","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"column-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-column-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":81},{"partial_implementation":true,"added":72}],"firefox_android":[{"added":81},{"partial_implementation":true,"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"row":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"row-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":81},{"partial_implementation":true,"added":72}],"firefox_android":[{"added":81},{"partial_implementation":true,"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-direction"},"flex-flow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-flow","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-flow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":28},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":28},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex-flow"},"flex-grow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-grow","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-grow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11},{"alternative_name":"-ms-flex-positive","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"less_than_zero_animate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":49}],"chrome_android":[{"added":49}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-grow"},"flex-shrink":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-shrink","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-shrink-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":8}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex-shrink"},"flex-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-wrap","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-wrap-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"partial_implementation":true,"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"nowrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"wrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"wrap-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-wrap-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-wrap"},"float":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/float","spec_url":["https://drafts.csswg.org/css2/#propdef-float","https://drafts.csswg.org/css-logical/#float-clear"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}}},"flood-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flood-color","spec_url":"https://drafts.fxtf.org/filter-effects/#FloodColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"flood-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flood-opacity","spec_url":"https://drafts.fxtf.org/filter-effects/#FloodOpacityProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"font":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font","spec_url":"https://drafts.csswg.org/css-fonts/#font-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]},"caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"font-width_keyword_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-stretch"]}},"icon":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"menu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"message-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"small-caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"status-bar":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}}},"font-family":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family","spec_url":["https://drafts.csswg.org/css-fonts/#generic-font-families","https://drafts.csswg.org/css-fonts/#font-family-prop"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-family"]},"math":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#math","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-family-math"]}},"system-ui":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#system-ui","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":92},{"alternative_name":"-apple-system","added":43}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"-apple-system","added":9}],"safari_ios":[{"added":11},{"alternative_name":"-apple-system","added":9}]},"tags":["web-features:font-family-system"]},"_aliasOf":"system-ui"},"ui-monospace":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-monospace","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-rounded":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-rounded","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-sans-serif":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-sans-serif","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-serif":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-serif","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"-apple-system":{"_aliasOf":"system-ui"}},"font-feature-settings":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-feature-settings","spec_url":"https://drafts.csswg.org/css-fonts/#font-feature-settings-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":16}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":15}],"firefox":[{"added":34},{"prefix":"-webkit-","added":129},{"prefix":"-moz-","added":15}],"firefox_android":[{"added":34},{"prefix":"-webkit-","added":129},{"prefix":"-moz-","added":15}],"ie":[{"added":10}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-feature-settings"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-feature-settings-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-feature-settings"]}},"_aliasOf":"font-feature-settings"},"font-kerning":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-kerning","spec_url":"https://drafts.csswg.org/css-fonts/#font-kerning-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33},{"prefix":"-webkit-","version_last":"32","added":29,"removed":33}],"chrome_android":[{"added":33},{"prefix":"-webkit-","version_last":"32","added":29,"removed":33}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":6}]},"tags":["web-features:font-kerning"]},"_aliasOf":"font-kerning"},"font-language-override":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-language-override","spec_url":"https://drafts.csswg.org/css-fonts/#font-language-override-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34},{"prefix":"-moz-","added":4}],"firefox_android":[{"added":34},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-language-override"]},"_aliasOf":"font-language-override"},"font-optical-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing","spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-def","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-auto-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]}}},"font-palette":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-palette","spec_url":"https://drafts.csswg.org/css-fonts/#font-palette-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]},"animation_computed":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-palette-animation"]}},"dark":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-dark","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"light":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-light","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"palette-mix_function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-palette/palette-mix","spec_url":"https://drafts.csswg.org/css-fonts/#typedef-font-palette-palette-mix","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-palette-animation"]}}},"font-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-size","spec_url":"https://drafts.csswg.org/css-fonts/#font-size-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-size"]},"math":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"rem_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":42}],"edge":[{"added":12}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":9}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-size"]}},"xxx-large":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size"]}}},"font-size-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-size-adjust","spec_url":"https://drafts.csswg.org/css-fonts-5/#font-size-adjust-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":3},{"partial_implementation":true,"version_last":"2","added":1,"removed":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size-adjust"]},"from-font":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts-5/#valdef-font-size-adjust-from-font","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:font-size-adjust"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts-5/#valdef-font-size-adjust-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size-adjust"]}},"two-values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:font-size-adjust"]}}},"font-smooth":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-smooth","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"alternative_name":"-webkit-font-smoothing","added":5}],"chrome_android":[{"alternative_name":"-webkit-font-smoothing","added":18}],"edge":[{"alternative_name":"-webkit-font-smoothing","added":79}],"firefox":[{"alternative_name":"-moz-osx-font-smoothing","added":25}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-font-smoothing","added":4}],"safari_ios":[{"alternative_name":"-webkit-font-smoothing","added":3.2}]}},"_aliasOf":"font-smooth"},"font-stretch":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-stretch","spec_url":"https://drafts.csswg.org/css-fonts/#font-stretch-prop","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":12}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":9}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-stretch"]},"percentage":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":18}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:font-stretch"]}}},"font-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-style","spec_url":"https://drafts.csswg.org/css-fonts/#font-style-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]},"italic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-italic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]}},"oblique-angle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-oblique-angle--90deg-90deg","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:font-style"]}}},"font-synthesis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:font-synthesis"]},"position":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis"]}},"small-caps":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}},"style":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}},"weight":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}}},"font-synthesis-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-position","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-position","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-position-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-position-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]}}},"font-synthesis-small-caps":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-small-caps","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-small-caps-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-small-caps-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]}}},"font-synthesis-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-style","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-style-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]}}},"font-synthesis-weight":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-weight","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-weight","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-weight-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-weight-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]}}},"font-variant":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant","spec_url":["https://drafts.csswg.org/css-fonts/#font-variant-prop","https://svgwg.org/svg2-draft/text.html#FontVariantProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-variant"]},"css_fonts_shorthand":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"greek_accented_characters":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant"]}},"historical-forms":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-alternates-historical-forms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-size-adjust-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:font-variant"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-variant"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"turkic_is":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:font-variant"]}},"uppercase_eszett":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant"]}}},"font-variant-alternates":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-alternates-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-alternates"]},"annotation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#annotation()","spec_url":"https://drafts.csswg.org/css-fonts/#annotation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"character_variant":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#character-variant()","spec_url":"https://drafts.csswg.org/css-fonts/#character-variant","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"historical-forms":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-alternates-historical-forms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-alternates"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-alternates-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-alternates"]}},"ornaments":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#ornaments()","spec_url":"https://drafts.csswg.org/css-fonts/#ornaments","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"styleset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#styleset()","spec_url":"https://drafts.csswg.org/css-fonts/#styleset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"stylistic":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#stylistic()","spec_url":"https://drafts.csswg.org/css-fonts/#stylistic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"swash":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#swash()","spec_url":"https://drafts.csswg.org/css-fonts/#swash","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}}},"font-variant-caps":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-caps","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-caps-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]},"all-petite-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-petite-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"all-small-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"petite-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-petite-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"small-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"titling-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-titling-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"unicase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-unicase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}}},"font-variant-east-asian":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-east-asian-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]},"full-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-full-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis04":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis04","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis78":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis78","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis83":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis83","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis90":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis90","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-east-asian-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"proportional-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-proportional-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"ruby":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-ruby","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"simplified":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-simplified","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"traditional":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-traditional","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}}},"font-variant-emoji":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-emoji","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-emoji-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"flags":[{"name":"layout.css.font-variant-emoji.enabled","type":"preference","value_to_set":"true"}],"added":108}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"flags":[{"name":"CSS font-variant-emoji property","type":"preference","value_to_set":"true"}],"added":17.5}],"safari_ios":[{"flags":[{"name":"CSS font-variant-emoji property","type":"preference","value_to_set":"true"}],"added":17.5}]},"tags":["web-features:font-variant-emoji"]},"emoji":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-emoji","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-text","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"unicode":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-unicode","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}}},"font-variant-ligatures":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":34},{"prefix":"-webkit-","added":31}],"chrome_android":[{"added":34},{"prefix":"-webkit-","added":31}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":7}]},"tags":["web-features:font-variant-ligatures"]},"common-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-common-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"contextual":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-contextual","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"discretionary-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-discretionary-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"historical-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-common-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-contextual":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-contextual","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-discretionary-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-discretionary-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-historical-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"_aliasOf":"font-variant-ligatures"},"font-variant-numeric":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-numeric-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]},"diagonal-fractions":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-diagonal-fractions","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"lining-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-lining-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-numeric-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"oldstyle-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-oldstyle-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"ordinal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-ordinal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"proportional-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-proportional-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"slashed-zero":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-slashed-zero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"stacked-fractions":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-stacked-fractions","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"tabular-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-tabular-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}}},"font-variant-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-position","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-position-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-position-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]}}},"font-variation-settings":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variation-settings","spec_url":"https://drafts.csswg.org/css-fonts/#font-variation-settings-def","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-variation-settings"]}},"font-weight":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-weight","spec_url":"https://drafts.csswg.org/css-fonts/#font-weight-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]},"bold":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-bold","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"bolder":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-bolder","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"lighter":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-lighter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"number":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":17}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-weight"]}}},"font-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#propdef-font-width","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]},"condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"extra-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-extra-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"extra-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-extra-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"semi-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-semi-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"semi-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-semi-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"ultra-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-ultra-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"ultra-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-ultra-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}}},"forced-color-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/forced-color-adjust","spec_url":"https://drafts.csswg.org/css-color-adjust/#forced-color-adjust-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79},{"alternative_name":"-ms-high-contrast-adjust","added":12}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"alternative_name":"-ms-high-contrast-adjust","added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"preserve-parent-color":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-preserve-parent-color","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":106}],"chrome_android":[{"added":106}],"edge":[{"added":106}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"_aliasOf":"forced-color-adjust"},"gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gap","spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-gap","added":10.3}]},"tags":["web-features:grid"]},"calc_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:grid"]}},"percentage_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}},"_aliasOf":"grid_context"},"multicol_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:multi-column"]}},"grid-gap":{"_aliasOf":"grid_context"}},"glyph-orientation-vertical":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes-4/#glyph-orientation","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:glyph-orientation-vertical"]}},"grid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid","spec_url":"https://drafts.csswg.org/css-grid/#grid-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-area":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-area","spec_url":"https://drafts.csswg.org/css-grid/#propdef-grid-area","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-auto-columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns","spec_url":"https://drafts.csswg.org/css-grid/#auto-tracks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-columns","version_last":"18","added":12,"removed":79}],"firefox":[{"added":70},{"partial_implementation":true,"version_last":"69","added":52,"removed":70}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":52,"removed":79}],"ie":[{"alternative_name":"-ms-grid-columns","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid-auto-columns"},"grid-auto-flow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow","spec_url":"https://drafts.csswg.org/css-grid/#grid-auto-flow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"column":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-column","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"dense":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-dense","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"row":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-row","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-auto-rows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows","spec_url":"https://drafts.csswg.org/css-grid/#auto-tracks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-rows","version_last":"18","added":12,"removed":79}],"firefox":[{"added":70},{"partial_implementation":true,"version_last":"69","added":52,"removed":70}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":52,"removed":79}],"ie":[{"alternative_name":"-ms-grid-rows","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid-auto-rows"},"grid-column":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column","spec_url":"https://drafts.csswg.org/css-grid/#placement-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-column-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column-end","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-column-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column-start","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row","spec_url":"https://drafts.csswg.org/css-grid/#placement-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row-end","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row-start","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-template":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template","spec_url":"https://drafts.csswg.org/css-grid/#explicit-grid-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-template-areas":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-areas","spec_url":"https://drafts.csswg.org/css-grid/#grid-template-areas-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-areas-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-template-columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-columns","spec_url":["https://drafts.csswg.org/css-grid/#track-sizing","https://drafts.csswg.org/css-grid/#subgrids"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-columns","version_last":"18","added":12,"removed":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"alternative_name":"-ms-grid-columns","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"animation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":107}],"chrome_android":[{"added":107}],"edge":[{"added":107}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:grid-animation"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content_function","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"masonry":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-3/#masonry-layout","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40128480","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40128480","added":false}],"edge":[{"impl_url":"https://crbug.com/40128480","added":false}],"firefox":[{"flags":[{"name":"layout.css.grid-template-masonry-value.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://bugzil.la/1757446","added":77}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/248287","added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:masonry"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"minmax":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/minmax","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-minmax","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-rows-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/repeat","spec_url":"https://drafts.csswg.org/css-grid/#repeat-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":76},{"partial_implementation":true,"version_last":"75","added":57,"removed":76},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":57,"removed":79},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"subgrid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Subgrid","spec_url":"https://drafts.csswg.org/css-grid/#subgrids","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:subgrid"]}},"_aliasOf":"grid-template-columns"},"grid-template-rows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-rows","spec_url":["https://drafts.csswg.org/css-grid/#track-sizing","https://drafts.csswg.org/css-grid/#subgrids"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-rows","version_last":"18","added":12,"removed":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"alternative_name":"-ms-grid-rows","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"animation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":107}],"chrome_android":[{"added":107}],"edge":[{"added":107}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:grid-animation"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"masonry":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Masonry_layout","spec_url":"https://drafts.csswg.org/css-grid-3/#masonry-layout","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40128480","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40128480","added":false}],"edge":[{"impl_url":"https://crbug.com/40128480","added":false}],"firefox":[{"flags":[{"name":"layout.css.grid-template-masonry-value.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://bugzil.la/1757446","added":77}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/248287","added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:masonry"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"minmax":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/minmax","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-minmax","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-rows-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/repeat","spec_url":"https://drafts.csswg.org/css-grid/#repeat-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":76},{"partial_implementation":true,"version_last":"75","added":57,"removed":76},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":57,"removed":79},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"subgrid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Subgrid","spec_url":"https://drafts.csswg.org/css-grid/#subgrids","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:subgrid"]}},"_aliasOf":"grid-template-rows"},"hanging-punctuation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation","spec_url":"https://drafts.csswg.org/css-text/#hanging-punctuation-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":10}],"safari_ios":[{"partial_implementation":true,"added":10}]},"tags":["web-features:hanging-punctuation"]},"allow-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-allow-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:hanging-punctuation"]}},"first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-first","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:hanging-punctuation"]}},"last":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-last","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:hanging-punctuation"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:hanging-punctuation"]}}},"height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/height","spec_url":["https://drafts.csswg.org/css-sizing/#preferred-size-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#preferred-size-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":9}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":9}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"hyphenate-character":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphenate-character","spec_url":"https://drafts.csswg.org/css-text-4/#propdef-hyphenate-character","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":106},{"prefix":"-webkit-","added":6}],"chrome_android":[{"added":106},{"prefix":"-webkit-","added":18}],"edge":[{"added":106},{"prefix":"-webkit-","added":79}],"firefox":[{"added":98}],"firefox_android":[{"added":98}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":5}]},"tags":["web-features:hyphenate-character"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-hyphenate-character-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":98}],"firefox_android":[{"added":98}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphenate-character"]}},"_aliasOf":"hyphenate-character"},"hyphenate-limit-chars":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphenate-limit-chars","spec_url":"https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-chars","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphenate-limit-chars"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-hyphenate-limit-chars-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphenate-limit-chars"]}}},"hyphens":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphens","spec_url":"https://drafts.csswg.org/css-text/#hyphens-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"prefix":"-webkit-","added":13}],"chrome_android":[{"added":55},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79},{"partial_implementation":true,"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":43},{"prefix":"-moz-","added":6}],"firefox_android":[{"added":43},{"prefix":"-moz-","added":6}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":17},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:hyphens"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88},{"partial_implementation":true,"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":88},{"partial_implementation":true,"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":4.2}]},"tags":["web-features:hyphens"]}},"language_afrikaans":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_albanian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_amharic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_armenian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_assamese":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_basque":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_belarusian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bengali":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bosnian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bulgarian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_catalan":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_croatian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_cyrillic_mongolian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_czech":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":130}],"firefox_android":[{"added":130}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_danish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_dutch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_english":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":12}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":10}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_esperanto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_estonian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ethiopic_script_mul":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ethiopic_script_und":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_finnish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_french":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_galician":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_georgian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_german_reformed_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_german_swiss_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_german_traditional_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_gujarati":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_hindi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_hungarian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_icelandic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_interlingua":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_irish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_italian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_kannada":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_kurmanji":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_latin":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_latvian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_lithuanian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_malayalam":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_marathi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_modern_greek":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_mongolian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_norwegian_nn":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_norwegian_no":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_old_slavonic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_oriya":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_polish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_portuguese":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_punjabi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_russian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_slovak":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":130}],"firefox_android":[{"added":130}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_slovenian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_spanish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_swedish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_tamil":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_telugu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_turkish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_turkmen":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ukrainian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_upper_sorbian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_welsh":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"_aliasOf":"hyphens"},"image-orientation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image-orientation","spec_url":"https://drafts.csswg.org/css-images/#the-image-orientation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]},"from-image":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-orientation-from-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-orientation-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]}}},"image-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image-rendering","spec_url":["https://drafts.csswg.org/css-images/#the-image-rendering","https://svgwg.org/svg2-draft/painting.html#ImageRendering"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:image-rendering"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:image-rendering"]}},"crisp-edges":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-crisp-edges","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-optimize-contrast","added":13}],"chrome_android":[{"alternative_name":"-webkit-optimize-contrast","added":18}],"edge":[{"alternative_name":"-webkit-optimize-contrast","added":79}],"firefox":[{"added":65},{"prefix":"-moz-","added":3.6}],"firefox_android":[{"added":65},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":7},{"alternative_name":"-webkit-optimize-contrast","added":6}],"safari_ios":[{"added":7},{"alternative_name":"-webkit-optimize-contrast","added":6}]},"tags":["web-features:crisp-edges"]},"_aliasOf":"crisp-edges"},"optimizeQuality":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"optimizeSpeed":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"pixelated":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-pixelated","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:image-rendering"]}},"smooth":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-smooth","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:smooth"]}},"-webkit-optimize-contrast":{"_aliasOf":"crisp-edges"},"-moz-crisp-edges":{"_aliasOf":"crisp-edges"}},"ime-mode":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#input-method-editor","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:ime-mode"]},"_aliasOf":"ime-mode"},"initial-letter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/initial-letter","spec_url":"https://drafts.csswg.org/css-inline/#sizing-drop-initials","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"impl_url":"https://bugzil.la/1223880","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1223880","added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":9}],"safari_ios":[{"prefix":"-webkit-","added":9}]},"tags":["web-features:initial-letter"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-initial-letter-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:initial-letter"]}},"_aliasOf":"initial-letter"},"inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inline-size","spec_url":["https://drafts.csswg.org/css-logical/#dimension-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57},{"alternative_name":"-webkit-logical-width","added":8}],"chrome_android":[{"added":57},{"alternative_name":"-webkit-logical-width","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-logical-width","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-logical-width","added":5.1}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-logical-width","added":5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"inline-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset","https://drafts.csswg.org/css-position/#propdef-inset"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}}},"inset-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block","https://drafts.csswg.org/css-position/#propdef-inset-block"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block"},"inset-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block-end","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block-end","https://drafts.csswg.org/css-position/#propdef-inset-block-end"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block-end","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block-end","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block-end"},"inset-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block-start","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block-start","https://drafts.csswg.org/css-position/#propdef-inset-block-start"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block-start","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block-start","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block-start"},"inset-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline","https://drafts.csswg.org/css-position/#propdef-inset-inline"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline"},"inset-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline-end","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline-end","https://drafts.csswg.org/css-position/#propdef-inset-inline-end"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline-end","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline-end","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline-end"},"inset-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline-start","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline-start","https://drafts.csswg.org/css-position/#propdef-inset-inline-start"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline-start","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline-start","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline-start"},"interactivity":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#propdef-interactivity","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-interactivity-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"inert":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-interactivity-inert","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"interpolate-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/interpolate-size","spec_url":"https://drafts.csswg.org/css-values-5/#interpolate-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1945962","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1945962","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]},"allow-keywords":{"__compat":{"spec_url":"https://drafts.csswg.org/css-values-5/#valdef-interpolate-size-allow-keywords","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]}},"numeric-only":{"__compat":{"spec_url":"https://drafts.csswg.org/css-values-5/#valdef-interpolate-size-numeric-only","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]}}},"isolation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/isolation","spec_url":"https://drafts.fxtf.org/compositing/#isolation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:isolation"]}},"justify-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-content","spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52},{"partial_implementation":true,"version_last":"51","added":21,"removed":52}],"chrome_android":[{"added":52},{"partial_implementation":true,"version_last":"51","added":25,"removed":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"left_right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"space-evenly":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"_aliasOf":"justify-content"},"justify-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-items","spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"justify-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-self","spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}},"-ms-grid_context":{"_aliasOf":"grid_context"}},"left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/left","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"letter-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/letter-spacing","spec_url":["https://drafts.csswg.org/css-text/#letter-spacing-property","https://svgwg.org/svg2-draft/text.html#LetterSpacingProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:letter-spacing"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-letter-spacing-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:letter-spacing"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}}},"lighting-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/lighting-color","spec_url":"https://drafts.fxtf.org/filter-effects/#LightingColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"line-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-break","spec_url":"https://drafts.csswg.org/css-text/#line-break-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":58},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":58},{"prefix":"-webkit-","added":18}],"edge":[{"added":14}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":5.5},{"prefix":"-ms-","added":8}],"safari":[{"added":11},{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":1}]},"tags":["web-features:line-break"]},"anywhere":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-anywhere","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:line-break"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:line-break"]}},"loose":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-loose","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:line-break"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:line-break"]}},"strict":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-strict","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:line-break"]}},"_aliasOf":"line-break"},"line-clamp":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-clamp","spec_url":"https://drafts.csswg.org/css-overflow-4/#propdef-line-clamp","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40336192","prefix":"-webkit-","added":6}],"chrome_android":[{"impl_url":"https://crbug.com/40336192","prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":17}],"firefox":[{"prefix":"-webkit-","added":68}],"firefox_android":[{"prefix":"-webkit-","added":68}],"ie":[{"added":false}],"safari":[{"added":18.2},{"prefix":"-webkit-","added":5}],"safari_ios":[{"added":18.2},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:line-clamp"]},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:line-clamp"]}},"_aliasOf":"line-clamp"},"line-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-height","spec_url":"https://drafts.csswg.org/css-inline/#line-height-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:line-height"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-line-height-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:line-height"]}}},"line-height-step":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-height-step","spec_url":"https://drafts.csswg.org/css-rhythm/#line-height-step","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":60}],"chrome_android":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":60}],"edge":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:rhythmic-sizing"]}},"list-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style","spec_url":"https://drafts.csswg.org/css-lists/#list-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"symbols":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/symbols","spec_url":"https://drafts.csswg.org/css-counter-styles/#symbols-function","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:list-style"]}}},"list-style-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-image","spec_url":"https://drafts.csswg.org/css-lists/#image-markers","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-list-style-image-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}}},"list-style-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-position","spec_url":"https://drafts.csswg.org/css-lists/#list-style-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"inside":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-list-style-position-inside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"outside":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#list-style-position-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}}},"list-style-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-type","spec_url":["https://drafts.csswg.org/css-lists/#text-markers","https://drafts.csswg.org/css-counter-styles/#extending-css2"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"afar":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"amharic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"amharic-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"arabic-indic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-arabic-indic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"arabic-indic"},"armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"asterisks":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"bengali":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-bengali","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"bengali"},"binary":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"cambodian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cambodian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"cjk-decimal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#cjk-decimal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"cjk-earthly-branch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cjk-earthly-branch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"cjk-earthly-branch"},"cjk-heavenly-stem":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cjk-heavenly-stem","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"cjk-heavenly-stem"},"cjk-ideographic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#cjk-ideographic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"decimal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#decimal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"decimal-leading-zero":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#decimal-leading-zero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"devanagari":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-devanagari","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"devanagari"},"disc":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"disclosure-closed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disclosure-closed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"disclosure-open":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disclosure-open","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"ethiopic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-am-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-gez":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-ti-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-ti-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]}},"_aliasOf":"ethiopic-halehame"},"ethiopic-halehame-aa-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-aa-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-am":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]}},"_aliasOf":"ethiopic-halehame-am"},"ethiopic-halehame-am-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-gez":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-om-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-sid-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-so-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-ti-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"ethiopic-halehame-ti-er"},"ethiopic-halehame-ti-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"ethiopic-halehame-ti-et"},"ethiopic-halehame-tig":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-numeric":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-ethiopic-numeric","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"ethiopic-numeric"},"footnotes":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"georgian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#georgian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"gujarati":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-gujarati","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"gujarati"},"gurmukhi":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-gurmukhi","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"gurmukhi"},"hangul":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"hangul"},"hangul-consonant":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"hangul-consonant"},"hebrew":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hebrew","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"hiragana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hiragana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"hiragana-iroha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hiragana-iroha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"japanese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#japanese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"japanese-formal"},"japanese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#japanese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"japanese-informal"},"kannada":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-kannada","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"kannada"},"katakana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#katakana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"katakana-iroha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#katakana-iroha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"khmer":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-khmer","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"khmer"},"korean-hangul-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hangul-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"korean-hanja-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hanja-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"korean-hanja-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hanja-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"lao":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-lao","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"lao"},"lower-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-lower-armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:list-style"]}},"lower-greek":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-greek","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-hexadecimal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"lower-latin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-latin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-norwegian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"lower-roman":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-roman","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"malayalam":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-malayalam","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"malayalam"},"mongolian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-mongolian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"myanmar":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-myanmar","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"myanmar"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-list-style-type-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"octal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"oriya":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-oriya","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"oriya"},"oromo":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"persian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-persian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"persian"},"sidama":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"simp-chinese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#simp-chinese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"simp-chinese-formal"},"simp-chinese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#simp-chinese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"simp-chinese-informal"},"somali":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"square":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#square","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"string":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":79}],"firefox":[{"added":39}],"firefox_android":[{"added":39}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:list-style"]}},"symbols":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/symbols","spec_url":"https://drafts.csswg.org/css-counter-styles/#symbols-function","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:list-style"]}},"tamil":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-tamil","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"tamil"},"telugu":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-telugu","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"telugu"},"thai":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-thai","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"thai"},"tibetan":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-tibetan","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"tigre":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-er-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-et-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"trad-chinese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#trad-chinese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"trad-chinese-formal"},"trad-chinese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#trad-chinese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"trad-chinese-informal"},"upper-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"upper-armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-upper-armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:list-style"]}},"upper-greek":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":1,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]}}},"upper-hexadecimal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"upper-latin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-latin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"upper-norwegian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"upper-roman":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-roman","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"urdu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":33}],"firefox_android":[{"prefix":"-moz-","added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"urdu"},"-moz-arabic-indic":{"_aliasOf":"arabic-indic"},"-moz-bengali":{"_aliasOf":"bengali"},"-moz-cjk-earthly-branch":{"_aliasOf":"cjk-earthly-branch"},"-moz-cjk-heavenly-stem":{"_aliasOf":"cjk-heavenly-stem"},"-moz-devanagari":{"_aliasOf":"devanagari"},"-moz-ethiopic-halehame":{"_aliasOf":"ethiopic-halehame"},"-moz-ethiopic-halehame-am":{"_aliasOf":"ethiopic-halehame-am"},"-moz-ethiopic-halehame-ti-er":{"_aliasOf":"ethiopic-halehame-ti-er"},"-moz-ethiopic-halehame-ti-et":{"_aliasOf":"ethiopic-halehame-ti-et"},"-moz-ethiopic-numeric":{"_aliasOf":"ethiopic-numeric"},"-moz-gujarati":{"_aliasOf":"gujarati"},"-moz-gurmukhi":{"_aliasOf":"gurmukhi"},"-moz-hangul":{"_aliasOf":"hangul"},"-moz-hangul-consonant":{"_aliasOf":"hangul-consonant"},"-moz-japanese-formal":{"_aliasOf":"japanese-formal"},"-moz-japanese-informal":{"_aliasOf":"japanese-informal"},"-moz-kannada":{"_aliasOf":"kannada"},"-moz-khmer":{"_aliasOf":"khmer"},"-moz-lao":{"_aliasOf":"lao"},"-moz-malayalam":{"_aliasOf":"malayalam"},"-moz-myanmar":{"_aliasOf":"myanmar"},"-moz-oriya":{"_aliasOf":"oriya"},"-moz-persian":{"_aliasOf":"persian"},"-moz-simp-chinese-formal":{"_aliasOf":"simp-chinese-formal"},"-moz-simp-chinese-informal":{"_aliasOf":"simp-chinese-informal"},"-moz-tamil":{"_aliasOf":"tamil"},"-moz-telugu":{"_aliasOf":"telugu"},"-moz-thai":{"_aliasOf":"thai"},"-moz-trad-chinese-formal":{"_aliasOf":"trad-chinese-formal"},"-moz-trad-chinese-informal":{"_aliasOf":"trad-chinese-informal"},"-moz-urdu":{"_aliasOf":"urdu"}},"margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin","spec_url":"https://drafts.csswg.org/css-box/#margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-margin-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block-end","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block-start","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-bottom","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-margin-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-margin-end","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-margin-end","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-margin-end","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-margin-end","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-margin-end","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-margin-end","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-margin-end","added":3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"margin-inline-end"},"margin-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-margin-start","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-margin-start","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-margin-start","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-margin-start","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-margin-start","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-margin-start","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-margin-start","added":3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"margin-inline-start"},"margin-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-left","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-right","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-top","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-trim","spec_url":"https://drafts.csswg.org/css-box-4/#margin-trim","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}}},"marker":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerShorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"marker-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-end","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerEndProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"marker-mid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-mid","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerMidProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"marker-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-start","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerStartProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"mask":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1},{"partial_implementation":true,"version_last":"119","added":1,"removed":120}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18},{"partial_implementation":true,"version_last":"119","added":18,"removed":120}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"partial_implementation":true,"version_last":"119","added":79,"removed":120},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":53},{"partial_implementation":true,"version_last":"52","added":2,"removed":53}],"firefox_android":[{"added":53},{"partial_implementation":true,"version_last":"52","added":4,"removed":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1},{"partial_implementation":true,"version_last":"15.3","added":3.1,"removed":15.4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2},{"partial_implementation":true,"version_last":"15.3","added":2,"removed":15.4}]},"tags":["web-features:masks"]},"_aliasOf":"mask"},"mask-border":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border"},"mask-border-outset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-outset","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-outset","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-outset","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-outset","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-outset","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-outset","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-outset"},"mask-border-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-repeat","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-repeat","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-repeat","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-repeat","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-repeat","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-repeat"},"mask-border-slice":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-slice","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-slice","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-slice","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-slice","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-slice","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-slice","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-slice"},"mask-border-source":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-source","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-source","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-source","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-source","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-source","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-source","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-source"},"mask-border-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-width","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-width","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-width","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-width","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-width","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-width","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-width"},"mask-clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-clip","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"border":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"padding":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-clip"},"mask-composite":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-composite","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-composite","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53},{"prefix":"-webkit-","added":53}],"firefox_android":[{"added":53},{"prefix":"-webkit-","added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]},"add":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-add","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"exclude":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-exclude","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"intersect":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-intersect","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"subtract":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-subtract","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-composite"},"mask-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-image","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":16,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"multiple_mask_images":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"svg_masks":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-image"},"mask-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-mode","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]},"alpha":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"luminance":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-luminance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"match-source":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-match-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}}},"mask-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-origin","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-origin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"border":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"border"},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"content"},"fill-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"padding":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"padding"},"stroke-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"view-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-origin","-webkit-border":{"_aliasOf":"border"},"-webkit-content":{"_aliasOf":"content"},"-webkit-padding":{"_aliasOf":"padding"}},"mask-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-position","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-position"},"mask-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-repeat","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-repeat"},"mask-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-size","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":4}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-size"},"mask-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-type","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]},"alpha":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-type-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]}},"luminance":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-type-luminance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]}}},"math-depth":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-depth","spec_url":"https://w3c.github.io/mathml-core/#the-math-script-level-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/202303","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/202303","added":false}]},"tags":["web-features:mathml"]}},"math-shift":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-shift","spec_url":"https://w3c.github.io/mathml-core/#the-math-shift","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"math-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-style","spec_url":"https://w3c.github.io/mathml-core/#the-math-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:mathml"]}},"max-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-block-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-max-block-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94}],"firefox_android":[{"added":94}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"max-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-height","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-max-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":18}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"max-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-inline-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-max-inline-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":10.1}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":10.3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"max-inline-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"max-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-width","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-max-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"min-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"min-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-block-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-min-block-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94}],"firefox_android":[{"added":94}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"min-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-height","spec_url":["https://drafts.csswg.org/css-sizing/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":34},{"version_last":"21","added":16,"removed":22}],"firefox_android":[{"added":34},{"version_last":"21","added":16,"removed":22}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:min-max-width-height"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":9}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":9}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"min-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-inline-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-min-inline-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"min-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-width","spec_url":["https://drafts.csswg.org/css-sizing/#min-size-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":34},{"version_last":"21","added":16,"removed":22}],"firefox_android":[{"added":34},{"version_last":"21","added":16,"removed":22}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:min-max-width-height"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"min-intrinsic","version_last":"47","added":25,"removed":48}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"min-intrinsic","version_last":"47","added":25,"removed":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"min-intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"min-intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"intrinsic":{"_aliasOf":"max-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"min-intrinsic":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"mix-blend-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode","spec_url":"https://drafts.fxtf.org/compositing/#mix-blend-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:mix-blend-mode"]},"plus-darker":{"__compat":{"spec_url":"https://drafts.fxtf.org/compositing/#plus-darker","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:mix-blend-mode"]}},"plus-lighter":{"__compat":{"spec_url":"https://drafts.fxtf.org/compositing/#plus-lighter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":100}],"chrome_android":[{"added":100}],"edge":[{"added":100}],"firefox":[{"added":99}],"firefox_android":[{"added":99}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:mix-blend-mode"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":false}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mix-blend-mode"]}}},"object-fit":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/object-fit","spec_url":"https://drafts.csswg.org/css-images/#the-object-fit","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":16,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"cover":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-cover","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"fill":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-fill","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"scale-down":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-scale-down","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"_aliasOf":"object-fit"},"object-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/object-position","spec_url":"https://drafts.csswg.org/css-images/#the-object-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":16,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-position"]},"_aliasOf":"object-position"},"object-view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images-5/#propdef-object-view-box","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:object-view-box"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images-5/#valdef-object-view-box-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:object-view-box"]}}},"offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset","spec_url":"https://drafts.fxtf.org/motion/#offset-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion","added":46}],"edge":[{"added":79},{"alternative_name":"motion","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"_aliasOf":"offset"},"offset-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-anchor","spec_url":"https://drafts.fxtf.org/motion/#offset-anchor-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-anchor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"bottom":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"center":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"left":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"right":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"top":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}}},"offset-distance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-distance","spec_url":"https://drafts.fxtf.org/motion/#offset-distance-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion-distance","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion-distance","added":46}],"edge":[{"added":79},{"alternative_name":"motion-distance","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"_aliasOf":"offset-distance"},"offset-path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-path","spec_url":"https://drafts.fxtf.org/motion/#offset-path-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion-path","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion-path","added":46}],"edge":[{"added":79},{"alternative_name":"motion-path","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:motion-path"]},"basic_shape":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-basic-shape","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"margin-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-margin-box","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"none":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"path":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"ray":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-ray","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"stroke-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"url":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-url","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:motion-path"]}},"view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"_aliasOf":"offset-path"},"offset-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-position","spec_url":"https://drafts.fxtf.org/motion/#offset-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"bottom":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"center":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"left":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"normal":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:motion-path"]}},"right":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"top":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}}},"offset-rotate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-rotate","spec_url":"https://drafts.fxtf.org/motion/#offset-rotate-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56},{"alternative_name":"offset-rotation","added":55},{"alternative_name":"motion-rotation","added":46}],"chrome_android":[{"added":56},{"alternative_name":"offset-rotation","added":55},{"alternative_name":"motion-rotation","added":46}],"edge":[{"added":79},{"alternative_name":"offset-rotation","added":79},{"alternative_name":"motion-rotation","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-rotate-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"reverse":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-rotate-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"_aliasOf":"offset-rotate"},"opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/opacity","spec_url":["https://drafts.csswg.org/css-color/#propdef-opacity","https://svgwg.org/svg2-draft/render.html#ObjectAndGroupOpacityProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1},{"prefix":"-moz-","version_last":"3","added":1,"removed":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":2},{"prefix":"-khtml-","version_last":"1.3","added":1.1,"removed":2}],"safari_ios":[{"added":1}]},"tags":["web-features:opacity"]},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":78}],"chrome_android":[{"added":78}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:opacity"]}},"_aliasOf":"opacity"},"order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/order","spec_url":"https://drafts.csswg.org/css-display/#order-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"order"},"orphans":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/orphans","spec_url":"https://drafts.csswg.org/css-break/#widows-orphans","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:widows-orphans"]}},"outline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline","spec_url":"https://drafts.csswg.org/css-ui/#outline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94},{"partial_implementation":true,"version_last":"93","added":1,"removed":94}],"chrome_android":[{"added":94},{"partial_implementation":true,"version_last":"93","added":18,"removed":94}],"edge":[{"added":94},{"partial_implementation":true,"version_last":"93","added":12,"removed":94}],"firefox":[{"added":88},{"partial_implementation":true,"version_last":"87","added":1.5,"removed":88},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":88},{"partial_implementation":true,"version_last":"87","added":4,"removed":88}],"ie":[{"added":8}],"safari":[{"added":16.4},{"partial_implementation":true,"version_last":"16.3","added":1.2,"removed":16.4}],"safari_ios":[{"added":16.4},{"partial_implementation":true,"version_last":"16.3","added":1,"removed":16.4}]},"tags":["web-features:outline"]},"_aliasOf":"outline"},"outline-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-color","spec_url":"https://drafts.csswg.org/css-ui/#outline-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"_aliasOf":"outline-color"},"outline-offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-offset","spec_url":"https://drafts.csswg.org/css-ui/#outline-offset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"outline-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-style","spec_url":"https://drafts.csswg.org/css-ui/#outline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#outline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"dashed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-dashed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"dotted":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-dotted","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"double":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-double","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"groove":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-groove","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"inset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-inset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"outset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"ridge":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-ridge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"solid":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-solid","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"_aliasOf":"outline-style"},"outline-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-width","spec_url":"https://drafts.csswg.org/css-ui/#outline-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"_aliasOf":"outline-width"},"overflow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow","spec_url":["https://drafts.csswg.org/css-overflow/#propdef-overflow","https://svgwg.org/svg2-draft/render.html#OverflowAndClipProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":114}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":114}],"edge":[{"added":12}],"firefox":[{"added":1},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":12}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":12}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":1.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-clip"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"multiple_keywords":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68}],"chrome_android":[{"added":68}],"edge":[{"added":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overflow-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-anchor","spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#exclusion-api","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#valdef-overflow-anchor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#valdef-overflow-anchor-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]}}},"overflow-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-block","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]},"overlay":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":112}],"firefox_android":[{"added":112}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]}}},"overflow-clip-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-clip-margin","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-clip-margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":90}],"chrome_android":[{"partial_implementation":true,"added":90}],"edge":[{"partial_implementation":true,"added":90}],"firefox":[{"partial_implementation":true,"added":102}],"firefox_android":[{"partial_implementation":true,"added":102}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}}},"overflow-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-inline","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]},"overlay":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":112}],"firefox_android":[{"added":112}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]}}},"overflow-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-wrap","spec_url":"https://drafts.csswg.org/css-text/#overflow-wrap-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23},{"alternative_name":"word-wrap","added":1}],"chrome_android":[{"added":25},{"alternative_name":"word-wrap","added":18}],"edge":[{"added":18},{"alternative_name":"word-wrap","added":12}],"firefox":[{"added":49},{"alternative_name":"word-wrap","added":3.5}],"firefox_android":[{"added":49},{"alternative_name":"word-wrap","added":4}],"ie":[{"alternative_name":"word-wrap","added":5.5}],"safari":[{"added":7},{"alternative_name":"word-wrap","added":1}],"safari_ios":[{"added":7},{"alternative_name":"word-wrap","added":1}]},"tags":["web-features:overflow-wrap"]},"anywhere":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-anywhere","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:overflow-wrap"]}},"break-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-break-word","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-wrap"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-wrap"]}},"_aliasOf":"overflow-wrap"},"overflow-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-x","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":15}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":100}],"edge":[{"added":12}],"firefox":[{"added":3.5},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":13.1}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":13.4}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":3.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-clip"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"_aliasOf":"overflow-x","overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overflow-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-y","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":15}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":100}],"edge":[{"added":12}],"firefox":[{"added":3.5},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":13.1}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":13.4}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":3.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-clip"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"_aliasOf":"overflow-y","overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overlay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overlay","spec_url":"https://drafts.csswg.org/css-position-4/#overlay","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-4/#valdef-overlay-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-4/#valdef-overlay-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]}}},"overscroll-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"padding":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding","spec_url":"https://drafts.csswg.org/css-box/#padding-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"padding-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block-end","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"padding-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block-start","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"padding-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-bottom","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-padding-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"padding-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-padding-end","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-padding-end","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-padding-end","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-padding-end","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-padding-end","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-padding-end","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-padding-end","added":3}]},"tags":["web-features:logical-properties"]},"_aliasOf":"padding-inline-end"},"padding-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-padding-start","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-padding-start","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-padding-start","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-padding-start","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-padding-start","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-padding-start","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-padding-start","added":3}]},"tags":["web-features:logical-properties"]},"_aliasOf":"padding-inline-start"},"padding-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-left","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-right","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-top","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"page":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page","spec_url":"https://drafts.csswg.org/css-page/#using-named-pages","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:page-selectors"]}},"page-break-after":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-after","spec_url":["https://drafts.csswg.org/css-logical/#page","https://drafts.csswg.org/css-page/#page-break-after","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-always","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"impl_url":"https://bugzil.la/775617","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/775617","added":false}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/34155","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/34155","added":false}]},"tags":["web-features:page-break-aliases"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-left","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-right","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"page-break-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-before","spec_url":["https://drafts.csswg.org/css-logical/#page","https://drafts.csswg.org/css-page/#page-break-before","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-always","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"impl_url":"https://bugzil.la/775617","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/775617","added":false}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/34155","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/34155","added":false}]},"tags":["web-features:page-break-aliases"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-left","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-right","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"page-break-inside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-inside","spec_url":["https://drafts.csswg.org/css-page/#page-break-inside","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"paint-order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/paint-order","spec_url":"https://svgwg.org/svg2-draft/painting.html#PaintOrderProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123},{"partial_implementation":true,"added":35}],"chrome_android":[{"added":123},{"partial_implementation":true,"added":35}],"edge":[{"added":123},{"partial_implementation":true,"added":79}],"firefox":[{"added":60}],"firefox_android":[{"added":60}],"ie":[{"added":false}],"safari":[{"added":11},{"partial_implementation":true,"added":8}],"safari_ios":[{"added":11},{"partial_implementation":true,"added":8}]},"tags":["web-features:paint-order"]}},"perspective":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/perspective","spec_url":"https://drafts.csswg.org/css-transforms-2/#perspective-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms3d"]}},"_aliasOf":"perspective"},"perspective-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/perspective-origin","spec_url":"https://drafts.csswg.org/css-transforms-2/#perspective-origin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"_aliasOf":"perspective-origin"},"place-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-content","spec_url":"https://drafts.csswg.org/css-align/#place-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"place-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-items","spec_url":"https://drafts.csswg.org/css-align/#place-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"place-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-self","spec_url":"https://drafts.csswg.org/css-align/#place-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#place-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}}},"pointer-events":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/pointer-events","spec_url":["https://drafts.csswg.org/css-ui/#pointer-events-control","https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:pointer-events"]},"html_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:pointer-events"]}}},"position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position","spec_url":"https://drafts.csswg.org/css-position/#position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:position"]},"absolute":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-absolute","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:absolute-positioning"]}},"absolutely_positioned_flex_children":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":10}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-fixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:fixed-positioning"]}},"position_sticky_table_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":16}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:sticky-positioning"]}},"relative":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-relative","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:relative-positioning"]}},"static":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-static","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:static-positioning"]}},"sticky":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-sticky","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":16}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":13},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":13},{"prefix":"-webkit-","added":7}]},"tags":["web-features:sticky-positioning"]},"_aliasOf":"sticky"},"-webkit-sticky":{"_aliasOf":"sticky"}},"position-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-anchor","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-anchor","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-anchor","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":125}],"chrome_android":[{"partial_implementation":true,"added":125}],"edge":[{"partial_implementation":true,"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"position-area":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-area","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-area","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"chrome_android":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"edge":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-bottom","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-inline-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-left","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-right","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-bottom","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-inline-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-top","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-x-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-x-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-x-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-x-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-y-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-y-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-y-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-y-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-top","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"position-area"},"position-try":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-prop","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"position-try-fallbacks":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try-fallbacks","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-fallbacks","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"chrome_android":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"edge":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"flip-block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flip-inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flip-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"position-area":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-position-area","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128},{"version_last":"127","added":125,"removed":128}],"chrome_android":[{"added":128},{"version_last":"127","added":125,"removed":128}],"edge":[{"added":128},{"version_last":"127","added":125,"removed":128}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"position-try-fallbacks"},"position-try-order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try-order","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-order-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"most-block-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-block-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-height":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-height","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-inline-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-inline-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-width","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"position-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-visibility","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-visibility","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-always","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchors-visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-anchors-visible","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"no-overflow":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-no-overflow","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"print-color-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/print-color-adjust","spec_url":"https://drafts.csswg.org/css-color-adjust/#propdef-print-color-adjust","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":136},{"prefix":"-webkit-","added":17}],"chrome_android":[{"added":136},{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":97},{"alternative_name":"color-adjust","added":48}],"firefox_android":[{"added":97},{"alternative_name":"color-adjust","added":48}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":6}]},"tags":["web-features:print-color-adjust"]},"economy":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-print-color-adjust-economy","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:print-color-adjust"]}},"exact":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-print-color-adjust-exact","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:print-color-adjust"]}},"_aliasOf":"print-color-adjust"},"quotes":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/quotes","spec_url":"https://drafts.csswg.org/css-content/#quotes","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:quotes"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-quotes-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:quotes"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-quotes-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:quotes"]}}},"r":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/r","spec_url":"https://svgwg.org/svg2-draft/geometry.html#R","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"reading-flow":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#reading-flow","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"chrome_android":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"edge":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:reading-flow"]}},"resize":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/resize","spec_url":"https://drafts.csswg.org/css-ui/#resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]},"block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}},"block_level_support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}},"inline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}}},"right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/right","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"rotate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/rotate","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}},"x_y_z_angle":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"row-gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/row-gap","spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-row-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-row-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-row-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-row-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-row-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-row-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-row-gap","added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"grid-row-gap":{"_aliasOf":"grid_context"}},"ruby-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ruby-align","spec_url":"https://drafts.csswg.org/css-ruby/#ruby-align-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"space-around":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-space-around","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"space-between":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-space-between","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}}},"ruby-overhang":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#propdef-ruby-overhang","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-overhang-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-overhang-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]}}},"ruby-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ruby-position","spec_url":"https://drafts.csswg.org/css-ruby/#rubypos","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":84},{"prefix":"-webkit-","added":18}],"edge":[{"added":84},{"prefix":"-webkit-","added":79},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":18.2},{"prefix":"-webkit-","added":7}]},"tags":["web-features:ruby-position"]},"alternate":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40174517","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40174517","added":false}],"edge":[{"impl_url":"https://crbug.com/40174517","added":false}],"firefox":[{"added":88}],"firefox_android":[{"added":88}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:ruby-position"]}},"inter-character":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":84}],"chrome_android":[{"partial_implementation":true,"added":84}],"edge":[{"partial_implementation":true,"added":84}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"over":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"_aliasOf":"ruby-position"},"rx":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/rx","spec_url":"https://svgwg.org/svg2-draft/geometry.html#RX","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"ry":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ry","spec_url":"https://svgwg.org/svg2-draft/geometry.html#RY","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"scale":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scale","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"scroll-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-behavior","spec_url":"https://drafts.csswg.org/css-overflow/#smooth-scrolling","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]}},"smooth":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scroll-behavior-smooth","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]}}},"scroll-initial-target":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#propdef-scroll-initial-target","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]},"nearest":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#valdef-scroll-initial-target-nearest","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#valdef-scroll-initial-target-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]}}},"scroll-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":90},{"partial_implementation":true,"version_last":"89","added":68,"removed":90}],"firefox_android":[{"added":90},{"partial_implementation":true,"version_last":"89","added":68,"removed":90}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin"},"scroll-margin-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-margin-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-bottom","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-bottom","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-bottom"},"scroll-margin-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-margin-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-left","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-left","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-left"},"scroll-margin-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-right","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-right","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-right"},"scroll-margin-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-top","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-top","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-top"},"scroll-marker-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-marker-group","spec_url":"https://drafts.csswg.org/css-overflow-5/#scroll-marker-group-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-markers"]},"after":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-after","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-markers"]}},"before":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-before","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-markers"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-markers"]}}},"scroll-padding":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-padding","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-snap-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-align","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}}},"scroll-snap-stop":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-stop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-stop-always","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-stop-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-snap-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":99},{"partial_implementation":true,"version_last":"98","added":68,"removed":99},{"version_last":"67","added":39,"removed":68}],"firefox_android":[{"added":68},{"version_last":"67","added":39,"removed":68}],"ie":[{"prefix":"-ms-","added":10}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:scroll-snap"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":39}],"firefox_android":[{"added":39}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-x","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"_aliasOf":"scroll-snap-type"},"scroll-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-timeline-shorthand","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"scroll-timeline-axis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-axis","spec_url":"https://drafts.csswg.org/scroll-animations/#propdef-scroll-timeline-axis","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-x","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-y","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"scroll-timeline-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-name","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-timeline-name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"scrollbar-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-color","spec_url":"https://drafts.csswg.org/css-scrollbars/#scrollbar-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/231590","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/231590","added":false}]},"tags":["web-features:scrollbar-color"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-color-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scrollbar-color"]}}},"scrollbar-gutter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter","spec_url":"https://drafts.csswg.org/css-overflow/#scrollbar-gutter-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scrollbar-gutter-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]}},"stable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scrollbar-gutter-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]}}},"scrollbar-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-width","spec_url":"https://drafts.csswg.org/css-scrollbars/#scrollbar-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}},"thin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-thin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}}},"shape-image-threshold":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold","spec_url":"https://drafts.csswg.org/css-shapes/#shape-image-threshold-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":78}],"chrome_android":[{"added":78}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:shape-outside"]}}},"shape-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-margin","spec_url":"https://drafts.csswg.org/css-shapes/#shape-margin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1},{"prefix":"-webkit-","added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"_aliasOf":"shape-margin"},"shape-outside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-outside","spec_url":"https://drafts.csswg.org/css-shapes/#shape-outside-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"circle":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#circle()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"gradient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image","spec_url":"https://drafts.csswg.org/css-images/#image-values","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#inset()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-shapes/#valdef-shape-outside-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape/path","spec_url":"https://drafts.csswg.org/css-shapes/#funcdef-basic-shape-path","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:shape-outside"]}},"polygon":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#polygon()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}}},"shape-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-rendering","spec_url":"https://svgwg.org/svg2-draft/painting.html#ShapeRendering","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"speak":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#speaking-props-speak","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":80}],"chrome_android":[{"partial_implementation":true,"added":80}],"edge":[{"partial_implementation":true,"added":80}],"firefox":[{"impl_url":"https://bugzil.la/1748064","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1748064","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:speak"]}},"speak-as":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/speak-as","spec_url":"https://drafts.csswg.org/css-speech-1/#speaking-props-speak-as","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"impl_url":"https://bugzil.la/1748068","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1748068","added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]},"digits":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-digits","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"literal-punctuation":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-literal-punctuation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"no-punctuation":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-no-punctuation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"spell-out":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-spell-out","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}}},"stop-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stop-color","spec_url":"https://svgwg.org/svg2-draft/pservers.html#StopColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stop-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stop-opacity","spec_url":"https://svgwg.org/svg2-draft/pservers.html#StopOpacityProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stroke":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke","spec_url":"https://svgwg.org/svg2-draft/painting.html#SpecifyingStrokePaint","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stroke-color":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-color","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:svg"]}},"stroke-dasharray":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-dasharray","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-dasharray","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"none":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-dasharray-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}}},"stroke-dashoffset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-dashoffset","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-dashoffset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stroke-linecap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-linecap","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-linecap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"butt":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-butt","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"round":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"square":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-square","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}}},"stroke-linejoin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-linejoin","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-linejoin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"bevel":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-bevel","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"miter":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-miter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"round":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}}},"stroke-miterlimit":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-miterlimit","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-miterlimit","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stroke-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-opacity","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-opacity","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:opacity-svg"]}},"stroke-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-width","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"tab-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/tab-size","spec_url":"https://drafts.csswg.org/css-text/#tab-size-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":91},{"prefix":"-moz-","added":4}],"firefox_android":[{"added":91},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:tab-size"]},"length":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/length","spec_url":"https://drafts.csswg.org/css-values/#lengths","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":42}],"chrome_android":[{"added":42}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:tab-size"]}},"_aliasOf":"tab-size"},"table-layout":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/table-layout","spec_url":"https://drafts.csswg.org/css2/#width-layout","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":14}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":3}]},"tags":["web-features:table"]}},"text-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-align","spec_url":["https://drafts.csswg.org/css-logical/#text-align","https://drafts.csswg.org/css-text/#text-align-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-align"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"center"},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:text-align"]}},"justify":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-justify","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-align"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"left"},"match-parent":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-match-parent","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"prefix":"-webkit-","added":16}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-align"]},"_aliasOf":"match-parent"},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"right"},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:text-align"]}},"-webkit-center":{"_aliasOf":"center"},"-moz-center":{"_aliasOf":"center"},"-khtml-center":{"_aliasOf":"center"},"-webkit-left":{"_aliasOf":"left"},"-moz-left":{"_aliasOf":"left"},"-khtml-left":{"_aliasOf":"left"},"-webkit-match-parent":{"_aliasOf":"match-parent"},"-webkit-right":{"_aliasOf":"right"},"-moz-right":{"_aliasOf":"right"},"-khtml-right":{"_aliasOf":"right"}},"text-align-last":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-align-last","spec_url":"https://drafts.csswg.org/css-text/#text-align-last-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":12}],"firefox":[{"added":49},{"prefix":"-moz-","version_last":"52","added":12,"removed":53}],"firefox_android":[{"added":49},{"prefix":"-moz-","version_last":"52","added":14,"removed":53}],"ie":[{"partial_implementation":true,"added":5.5}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:text-align-last"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-last-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":12}],"firefox":[{"added":12}],"firefox_android":[{"added":14}],"ie":[{"added":11}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:text-align-last"]}},"_aliasOf":"text-align-last"},"text-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-anchor","spec_url":"https://svgwg.org/svg2-draft/text.html#TextAnchorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":14}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"text-autospace":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#propdef-text-autospace","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"ideograph-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-ideograph-alpha","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"ideograph-numeric":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-ideograph-numeric","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"no-autospace":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-no-autospace","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}}},"text-box":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-box-edge":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box-edge","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-edge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-edge-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-box-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box-trim","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-trim","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-combine-upright":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-combine-upright","spec_url":"https://drafts.csswg.org/css-writing-modes/#text-combine-upright","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":9}],"chrome_android":[{"added":48},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":18}],"edge":[{"added":79},{"alternative_name":"-ms-text-combine-horizontal","version_last":"18","added":12,"removed":79}],"firefox":[{"added":48}],"firefox_android":[{"added":48}],"ie":[{"alternative_name":"-ms-text-combine-horizontal","added":11}],"safari":[{"added":15.4},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":5.1}],"safari_ios":[{"added":15.4},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":5}]},"tags":["web-features:text-combine-upright"]},"_aliasOf":"text-combine-upright"},"text-decoration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration","spec_url":["https://drafts.csswg.org/css-text-decor/#text-decoration-property","https://svgwg.org/svg2-draft/text.html#TextDecorationProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-decoration"]},"includes_color-and-style":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":8}],"safari_ios":[{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"_aliasOf":"includes_color-and-style"},"includes_thickness":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"-webkit-includes_color-and-style":{"_aliasOf":"includes_color-and-style"}},"text-decoration-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-color","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-color-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"_aliasOf":"text-decoration-color"},"text-decoration-line":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-line","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-line-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"blink":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-blink","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration-line-blink"]}},"grammar-error":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-grammar-error","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"line-through":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-line-through","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"overline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-overline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"spelling-error":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-spelling-error","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"underline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-underline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-line"},"text-decoration-skip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-skipping","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"version_last":"63","added":57,"removed":64}],"chrome_android":[{"version_last":"63","added":57,"removed":64}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-decoration"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-skip"},"text-decoration-skip-ink":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-skip-ink-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40675832","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40675832","added":false}],"edge":[{"impl_url":"https://crbug.com/40675832","added":false}],"firefox":[{"added":75}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}}},"text-decoration-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-style","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"wavy":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-style"},"text-decoration-thickness":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-width-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"chrome_android":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"edge":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-thickness-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]}},"from-font":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-thickness-from-font","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]}},"percentage":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-decoration"]}}},"text-emphasis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"_aliasOf":"text-emphasis"},"text-emphasis-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-color-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"_aliasOf":"text-emphasis-color"},"text-emphasis-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":132}],"firefox_android":[{"added":132}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-emphasis"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-emphasis"]}},"over":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":108}],"firefox_android":[{"added":108}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-emphasis"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":108}],"firefox_android":[{"added":108}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"_aliasOf":"text-emphasis-position"},"text-emphasis-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"dot":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-dot","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"double-circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-double-circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"filled":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-filled","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"sesame":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-sesame","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"triangle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-triangle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"_aliasOf":"text-emphasis-style"},"text-indent":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-indent","spec_url":"https://drafts.csswg.org/css-text/#text-indent-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-indent"]},"each-line":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-indent-each-line","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:text-indent-each-line"]}},"hanging":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-indent-hanging","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:text-indent-hanging"]}}},"text-justify":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-justify","spec_url":"https://drafts.csswg.org/css-text/#text-justify-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":32}],"chrome_android":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":32}],"edge":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":79},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/99945","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/99945","added":false}]},"tags":["web-features:text-justify"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"inter-character":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-inter-character","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55},{"alternative_name":"distribute","added":55}],"firefox_android":[{"added":55},{"alternative_name":"distribute","added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]},"_aliasOf":"inter-character"},"inter-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-inter-word","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"distribute":{"_aliasOf":"inter-character"}},"text-orientation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-orientation","spec_url":"https://drafts.csswg.org/css-writing-modes/#text-orientation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":14},{"prefix":"-webkit-","added":5}]},"tags":["web-features:text-orientation"]},"mixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-mixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-orientation"]}},"sideways":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-sideways","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12},{"alternative_name":"sideways-right","added":83}],"chrome_android":[{"added":18},{"alternative_name":"sideways-right","added":83}],"edge":[{"added":79},{"alternative_name":"sideways-right","added":83}],"firefox":[{"added":44},{"alternative_name":"sideways-right","added":72}],"firefox_android":[{"added":44},{"alternative_name":"sideways-right","added":79}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-orientation"]},"_aliasOf":"sideways"},"upright":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-upright","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-orientation"]}},"_aliasOf":"text-orientation","sideways-right":{"_aliasOf":"sideways"}},"text-overflow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-overflow","spec_url":["https://drafts.csswg.org/css-overflow/#text-overflow","https://svgwg.org/svg2-draft/text.html#TextOverflowProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":6},{"prefix":"-ms-","added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]}},"ellipsis":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#overflow-ellipsis","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]}},"string":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:custom-ellipses"]}},"two_value_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-overflow"]}},"_aliasOf":"text-overflow"},"text-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-rendering","spec_url":"https://svgwg.org/svg2-draft/painting.html#TextRenderingProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}},"geometricPrecision":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg"]}}},"text-shadow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-shadow","spec_url":"https://drafts.csswg.org/css-text-decor/#text-shadow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-shadow"]}},"text-size-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-size-adjust","spec_url":"https://drafts.csswg.org/css-size-adjust/#adjustment-control","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79},{"prefix":"-webkit-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":14}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"prefix":"-webkit-","added":1}]},"tags":["web-features:text-size-adjust"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"percentages":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-percentage-0","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"_aliasOf":"text-size-adjust"},"text-spacing-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-spacing-trim","spec_url":"https://drafts.csswg.org/css-text-4/#text-spacing-trim-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"space-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-space-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"space-first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-space-first","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"trim-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-trim-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}}},"text-transform":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-transform","spec_url":"https://drafts.csswg.org/css-text-4/#text-transform","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]},"capitalize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-capitalize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"dutch_ij_digraph":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-transform"]}},"full-size-kana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-full-size-kana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:text-transform"]}},"full-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-full-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:text-transform"]}},"greek_accented_characters":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":34}],"chrome_android":[{"added":34}],"edge":[{"added":79}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-transform"]}},"lowercase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-lowercase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"lowercase_sigma":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:text-transform"]}},"math-auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-math-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"turkic_is":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-transform"]}},"uppercase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-uppercase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"uppercase_eszett":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}}},"text-underline-offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-underline-offset","spec_url":"https://drafts.csswg.org/css-text-decor-4/#underline-offset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-offset"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-underline-offset-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-offset"]}},"percentage":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-underline-offset-percentage","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-offset"]}}},"text-underline-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-underline-position","spec_url":"https://drafts.csswg.org/css-text-decor/#text-underline-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33}],"chrome_android":[{"added":33}],"edge":[{"added":12}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":6}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":9}]},"tags":["web-features:text-underline-position"]},"from-font":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-position"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-position"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-position"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33}],"chrome_android":[{"added":33}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-position"]}},"_aliasOf":"text-underline-position"},"text-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap"]},"balance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#balance","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-balance"]}},"nowrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#nowrap","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-mode-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-nowrap"]}},"pretty":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#pretty","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:text-wrap-pretty"]}},"stable":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#stable","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-stable"]}},"wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#wrap","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-mode-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap"]}}},"text-wrap-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap-mode","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]},"nowrap":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]}},"wrap":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]}}},"text-wrap-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap-style","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}},"balance":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}},"pretty":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-wrap-style"]}},"stable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}}},"timeline-scope":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/timeline-scope","spec_url":"https://drafts.csswg.org/scroll-animations/#propdef-timeline-scope","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-timeline-scope-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-timeline-scope-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/top","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"touch-action":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/touch-action","spec_url":["https://compat.spec.whatwg.org/#touch-action","https://w3c.github.io/pointerevents/#the-touch-action-css-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":9.3}]},"tags":["web-features:touch-action"]},"manipulation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":9.3}]},"tags":["web-features:touch-action"]},"_aliasOf":"manipulation"},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"none"},"pan-down":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-up":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pan-x"},"pan-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pan-y"},"pinch-zoom":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":12}],"firefox":[{"added":85}],"firefox_android":[{"added":85}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pinch-zoom"},"_aliasOf":"touch-action","-ms-manipulation":{"_aliasOf":"manipulation"},"-ms-none":{"_aliasOf":"none"},"-ms-pan-x":{"_aliasOf":"pan-x"},"-ms-pan-y":{"_aliasOf":"pan-y"},"-ms-pinch-zoom":{"_aliasOf":"pinch-zoom"}},"transform":{"3d":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms3d"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform","spec_url":["https://drafts.csswg.org/css-transforms-2/#transform-functions","https://drafts.csswg.org/css-transforms/#transform-property","https://svgwg.org/svg2-draft/coords.html#TransformProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":10},{"prefix":"-webkit-","added":11},{"prefix":"-ms-","added":9}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:transforms2d"]},"_aliasOf":"transform"},"transform-box":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-box","spec_url":"https://drafts.csswg.org/css-transforms/#transform-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:transform-box"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"stroke-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}}},"transform-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-origin","spec_url":"https://drafts.csswg.org/css-transforms/#transform-origin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":10},{"prefix":"-ms-","added":9}],"safari":[{"added":9},{"prefix":"-webkit-","added":2}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:transforms2d"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":17}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg"]}},"three_value_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms2d"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"_aliasOf":"transform-origin"},"transform-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-style","spec_url":"https://drafts.csswg.org/css-transforms-2/#transform-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"_aliasOf":"transform-style"},"transition":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition","spec_url":"https://drafts.csswg.org/css-transitions/#transition-shorthand-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"preview","added":4,"removed":null}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4,"removed":false}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"gradients_can_animate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:transitions"]}},"transition-behavior":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":129}],"firefox_android":[{"added":129}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:transition-behavior"]}},"_aliasOf":"transition"},"transition-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-behavior","spec_url":"https://drafts.csswg.org/css-transitions-2/#transition-behavior-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":129}],"firefox_android":[{"added":129}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:transition-behavior"]}},"transition-delay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-delay","spec_url":"https://drafts.csswg.org/css-transitions/#transition-delay-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"_aliasOf":"transition-delay"},"transition-duration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-duration","spec_url":"https://drafts.csswg.org/css-transitions/#transition-duration-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"_aliasOf":"transition-duration"},"transition-property":{"IDENT_value":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3}]},"tags":["web-features:transitions"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-property","spec_url":"https://drafts.csswg.org/css-transitions/#transition-property-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transitions/#valdef-transition-property-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:transitions"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transitions/#propdef-transition-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:transitions"]}},"_aliasOf":"transition-property"},"transition-timing-function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-timing-function","spec_url":"https://drafts.csswg.org/css-transitions/#transition-timing-function-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"jump":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":14}],"safari_ios":[{"added":14}]},"tags":["web-features:transitions"]}},"_aliasOf":"transition-timing-function"},"translate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/translate","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"unicode-bidi":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/unicode-bidi","spec_url":"https://drafts.csswg.org/css-writing-modes/#unicode-bidi","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]},"bidi-override":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-bidi-override","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"embed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-embed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"isolate":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-isolate","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":16}],"chrome_android":[{"added":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":6}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"isolate"},"isolate-override":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-isolate-override","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":17,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":17,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"isolate-override"},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"plaintext":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-plaintext","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":6}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"plaintext"},"-webkit-isolate":{"_aliasOf":"isolate"},"-moz-isolate":{"_aliasOf":"isolate"},"-moz-isolate-override":{"_aliasOf":"isolate-override"},"-webkit-isolate-override":{"_aliasOf":"isolate-override"},"-moz-plaintext":{"_aliasOf":"plaintext"},"-webkit-plaintext":{"_aliasOf":"plaintext"}},"user-modify":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/user-modify","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"partial_implementation":true,"prefix":"-moz-","version_last":"131","added":1,"removed":132}],"firefox_android":[{"partial_implementation":true,"prefix":"-moz-","version_last":"131","added":4,"removed":132}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":5}]}},"read-write-plaintext-only":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":5}]}}},"_aliasOf":"user-modify"},"user-select":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/user-select","spec_url":"https://drafts.csswg.org/css-ui/#content-selection","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":54},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":54},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":12},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":69},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":79},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"prefix":"-ms-","added":10}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":3}]},"tags":["web-features:user-select"]},"all":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":53}],"chrome_android":[{"added":53}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:user-select"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]}},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":21},{"prefix":"-moz-","version_last":"64","added":1,"removed":65}],"firefox_android":[{"added":21},{"prefix":"-moz-","version_last":"64","added":4,"removed":65}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]},"_aliasOf":"none"},"text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]}},"_aliasOf":"user-select","-moz-none":{"_aliasOf":"none"}},"vector-effect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/vector-effect","spec_url":"https://svgwg.org/svg2-draft/coords.html#VectorEffectProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}},"vertical-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/vertical-align","spec_url":"https://drafts.csswg.org/css-inline/#propdef-vertical-align","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]},"baseline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-baseline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"middle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-middle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"text-bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-text-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"text-top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-text-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}}},"view-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-shorthand","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view-timeline-axis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-axis","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-axis","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-x","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-y","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"view-timeline-inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-inset","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-inset","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-view-timeline-inset-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"view-timeline-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-name","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view-transition-class":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions-2/#view-transition-class-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1860854","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1860854","added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:view-transition-class"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions-2/#valdef-view-transition-class-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:view-transition-class"]}}},"view-transition-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-transition-name","spec_url":"https://drafts.csswg.org/css-view-transitions/#view-transition-name-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"impl_url":"https://bugzil.la/1823896","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1823896","added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:view-transitions"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions/#valdef-view-transition-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:view-transitions"]}}},"visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/visibility","spec_url":["https://drafts.csswg.org/css-display/#visibility","https://svgwg.org/svg2-draft/render.html#VisibilityControl"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]},"collapse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}}},"white-space":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/white-space","spec_url":["https://drafts.csswg.org/css-text-4/#white-space-property","https://svgwg.org/svg2-draft/text.html#TextWhiteSpace"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]},"break-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-break-spaces","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":76}],"chrome_android":[{"added":76}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:white-space"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"nowrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre-line":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre-line","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre-wrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]},"_aliasOf":"pre-wrap"},"shorthand_values":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":114}],"chrome_android":[{"partial_implementation":true,"added":114}],"edge":[{"partial_implementation":true,"added":114}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space"]}},"textarea_support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"-moz-pre-wrap":{"_aliasOf":"pre-wrap"}},"white-space-collapse":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/white-space-collapse","spec_url":"https://drafts.csswg.org/css-text-4/#white-space-collapsing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]},"break-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-break-spaces","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"collapse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve-breaks":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve-breaks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve-spaces","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space-collapse"]}}},"widows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/widows","spec_url":["https://drafts.csswg.org/css-break/#widows-orphans","https://drafts.csswg.org/css-multicol/#filling-columns"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:widows-orphans"]}},"width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/width","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#preferred-size-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content","spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22},{"alternative_name":"intrinsic","version_last":"47","added":1,"removed":48}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"intrinsic","version_last":"47","added":18,"removed":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content_function","spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"is_animatable":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26}],"chrome_android":[{"added":26}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:width-height"]}},"max-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-content","spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-content","spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"alternative_name":"min-intrinsic","version_last":"47","added":1,"removed":48}],"chrome_android":[{"added":46},{"alternative_name":"min-intrinsic","version_last":"47","added":18,"removed":48}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"min-intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"min-intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"alternative_name":"-moz-available","added":3}],"firefox_android":[{"alternative_name":"-moz-available","added":4}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":7}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":7}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"max-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"min-intrinsic":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"},"-moz-available":{"_aliasOf":"stretch"}},"will-change":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/will-change","spec_url":"https://drafts.csswg.org/css-will-change/#will-change","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}},"contents":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-contents","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}},"scroll-position":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-scroll-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}}},"word-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/word-break","spec_url":"https://drafts.csswg.org/css-text/#word-break-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":5.5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]},"auto-phrase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-word-break-auto-phrase","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:word-break-auto-phrase"]}},"break-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-break-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]}},"break-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-break-word","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":67}],"firefox_android":[{"added":67}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break-break-word"]}},"keep-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-keep-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":44}],"chrome_android":[{"added":44}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":5.5}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:word-break"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]}},"_aliasOf":"word-break"},"word-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/word-spacing","spec_url":["https://drafts.csswg.org/css-text/#word-spacing-property","https://svgwg.org/svg2-draft/text.html#WordSpacingProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:word-spacing"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-spacing-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:word-spacing"]}},"percentages":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}}},"writing-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/writing-mode","spec_url":["https://drafts.csswg.org/css-writing-modes/#block-flow","https://svgwg.org/svg2-draft/text.html#WritingModeProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":8}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":9},{"prefix":"-ms-","added":9}],"safari":[{"added":10.1},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":10.3},{"prefix":"-webkit-","added":5}]},"tags":["web-features:writing-mode"]},"horizontal-tb":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"lr":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"lr-tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"rl":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"rl-tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"sideways-lr":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:writing-mode"]}},"sideways-rl":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:writing-mode"]}},"tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"tb-rl":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"vertical-lr":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"vertical-rl":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"vertical_oriented_form_controls":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"chrome_android":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"edge":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"firefox":[{"added":120}],"firefox_android":[{"added":120}],"ie":[{"added":false}],"safari":[{"added":17.4},{"partial_implementation":true,"added":16.5}],"safari_ios":[{"added":17.4},{"partial_implementation":true,"added":16.5}]},"tags":["web-features:vertical-form-controls"]}},"_aliasOf":"writing-mode"},"x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/x","spec_url":"https://svgwg.org/svg2-draft/geometry.html#X","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":42}],"chrome_android":[{"added":42}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/y","spec_url":"https://svgwg.org/svg2-draft/geometry.html#Y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":42}],"chrome_android":[{"added":42}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"z-index":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/z-index","spec_url":"https://drafts.csswg.org/css2/#z-index","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-z-index-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]}},"negative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]}}},"zoom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/zoom","spec_url":"https://drafts.csswg.org/css-viewport/#zoom-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":126}],"firefox_android":[{"added":126}],"ie":[{"added":5.5}],"safari":[{"added":3.1}],"safari_ios":[{"added":3}]},"tags":["web-features:zoom"]},"reset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/zoom#Values","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"58","added":1,"removed":59}],"chrome_android":[{"version_last":"58","added":18,"removed":59}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"18.3","added":3.1,"removed":18.4}],"safari_ios":[{"version_last":"18.3","added":3,"removed":18.4}]}}}},"-webkit-align-content":{"_aliasOf":"align-content"},"-webkit-align-items":{"_aliasOf":"align-items"},"-webkit-align-self":{"_aliasOf":"align-self"},"-webkit-alt":{"_aliasOf":"alt"},"-webkit-animation":{"_aliasOf":"animation"},"-moz-animation":{"_aliasOf":"animation"},"-o-animation":{"_aliasOf":"animation"},"-webkit-animation-delay":{"_aliasOf":"animation-delay"},"-moz-animation-delay":{"_aliasOf":"animation-delay"},"-o-animation-delay":{"_aliasOf":"animation-delay"},"-webkit-animation-direction":{"_aliasOf":"animation-direction"},"-moz-animation-direction":{"_aliasOf":"animation-direction"},"-o-animation-direction":{"_aliasOf":"animation-direction"},"-webkit-animation-duration":{"_aliasOf":"animation-duration"},"-moz-animation-duration":{"_aliasOf":"animation-duration"},"-o-animation-duration":{"_aliasOf":"animation-duration"},"-webkit-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-moz-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-o-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-webkit-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-moz-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-o-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-webkit-animation-name":{"_aliasOf":"animation-name"},"-moz-animation-name":{"_aliasOf":"animation-name"},"-o-animation-name":{"_aliasOf":"animation-name"},"-webkit-animation-play-state":{"_aliasOf":"animation-play-state"},"-moz-animation-play-state":{"_aliasOf":"animation-play-state"},"-o-animation-play-state":{"_aliasOf":"animation-play-state"},"-webkit-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-moz-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-o-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-webkit-appearance":{"_aliasOf":"appearance"},"-moz-appearance":{"_aliasOf":"appearance"},"-webkit-backdrop-filter":{"_aliasOf":"backdrop-filter"},"-webkit-backface-visibility":{"_aliasOf":"backface-visibility"},"-moz-backface-visibility":{"_aliasOf":"backface-visibility"},"-webkit-background-clip":{"_aliasOf":"background-clip"},"-moz-background-clip":{"_aliasOf":"background-clip"},"-webkit-background-origin":{"_aliasOf":"background-origin"},"-moz-background-origin":{"_aliasOf":"background-origin"},"-webkit-background-size":{"_aliasOf":"background-size"},"-moz-background-size":{"_aliasOf":"background-size"},"-o-background-size":{"_aliasOf":"background-size"},"-webkit-border-bottom-left-radius":{"_aliasOf":"border-bottom-left-radius"},"-moz-border-radius-bottomleft":{"_aliasOf":"border-bottom-left-radius"},"-webkit-border-bottom-right-radius":{"_aliasOf":"border-bottom-right-radius"},"-moz-border-radius-bottomright":{"_aliasOf":"border-bottom-right-radius"},"-webkit-border-image":{"_aliasOf":"border-image"},"-moz-border-image":{"_aliasOf":"border-image"},"-o-border-image":{"_aliasOf":"border-image"},"-webkit-border-image-slice":{"_aliasOf":"border-image-slice"},"-moz-border-end-color":{"_aliasOf":"border-inline-end-color"},"-moz-border-end-style":{"_aliasOf":"border-inline-end-style"},"-moz-border-end-width":{"_aliasOf":"border-inline-end-width"},"-moz-border-start-color":{"_aliasOf":"border-inline-start-color"},"-moz-border-start-style":{"_aliasOf":"border-inline-start-style"},"-webkit-border-radius":{"_aliasOf":"border-radius"},"-moz-border-radius":{"_aliasOf":"border-radius"},"-webkit-border-top-left-radius":{"_aliasOf":"border-top-left-radius"},"-moz-border-radius-topleft":{"_aliasOf":"border-top-left-radius"},"-webkit-border-top-right-radius":{"_aliasOf":"border-top-right-radius"},"-moz-border-radius-topright":{"_aliasOf":"border-top-right-radius"},"-webkit-box-align":{"_aliasOf":"box-align"},"-moz-box-align":{"_aliasOf":"box-align"},"-khtml-box-align":{"_aliasOf":"box-align"},"-webkit-box-decoration-break":{"_aliasOf":"box-decoration-break"},"-webkit-box-direction":{"_aliasOf":"box-direction"},"-moz-box-direction":{"_aliasOf":"box-direction"},"-khtml-box-direction":{"_aliasOf":"box-direction"},"-webkit-box-flex":{"_aliasOf":"box-flex"},"-moz-box-flex":{"_aliasOf":"box-flex"},"-khtml-box-flex":{"_aliasOf":"box-flex"},"-webkit-box-flex-group":{"_aliasOf":"box-flex-group"},"-khtml-box-flex-group":{"_aliasOf":"box-flex-group"},"-webkit-box-lines":{"_aliasOf":"box-lines"},"-khtml-box-lines":{"_aliasOf":"box-lines"},"-webkit-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-moz-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-khtml-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-webkit-box-orient":{"_aliasOf":"box-orient"},"-moz-box-orient":{"_aliasOf":"box-orient"},"-khtml-box-orient":{"_aliasOf":"box-orient"},"-webkit-box-pack":{"_aliasOf":"box-pack"},"-moz-box-pack":{"_aliasOf":"box-pack"},"-khtml-box-pack":{"_aliasOf":"box-pack"},"-webkit-box-shadow":{"_aliasOf":"box-shadow"},"-moz-box-shadow":{"_aliasOf":"box-shadow"},"-webkit-box-sizing":{"_aliasOf":"box-sizing"},"-moz-box-sizing":{"_aliasOf":"box-sizing"},"-webkit-clip-path":{"_aliasOf":"clip-path"},"-webkit-column-count":{"_aliasOf":"column-count"},"-moz-column-count":{"_aliasOf":"column-count"},"-moz-column-fill":{"_aliasOf":"column-fill"},"-webkit-column-fill":{"_aliasOf":"column-fill"},"-webkit-column-rule":{"_aliasOf":"column-rule"},"-moz-column-rule":{"_aliasOf":"column-rule"},"-webkit-column-rule-color":{"_aliasOf":"column-rule-color"},"-moz-column-rule-color":{"_aliasOf":"column-rule-color"},"-webkit-column-rule-style":{"_aliasOf":"column-rule-style"},"-moz-column-rule-style":{"_aliasOf":"column-rule-style"},"-webkit-column-rule-width":{"_aliasOf":"column-rule-width"},"-moz-column-rule-width":{"_aliasOf":"column-rule-width"},"-webkit-column-span":{"_aliasOf":"column-span"},"-webkit-column-width":{"_aliasOf":"column-width"},"-moz-column-width":{"_aliasOf":"column-width"},"-webkit-columns":{"_aliasOf":"columns"},"-moz-columns":{"_aliasOf":"columns"},"-webkit-filter":{"_aliasOf":"filter"},"-webkit-flex":{"_aliasOf":"flex"},"-ms-flex":{"_aliasOf":"flex"},"-webkit-flex-basis":{"_aliasOf":"flex-basis"},"-webkit-flex-direction":{"_aliasOf":"flex-direction"},"-ms-flex-direction":{"_aliasOf":"flex-direction"},"-webkit-flex-flow":{"_aliasOf":"flex-flow"},"-webkit-flex-grow":{"_aliasOf":"flex-grow"},"-ms-flex-positive":{"_aliasOf":"flex-grow"},"-webkit-flex-shrink":{"_aliasOf":"flex-shrink"},"-webkit-flex-wrap":{"_aliasOf":"flex-wrap"},"-webkit-font-feature-settings":{"_aliasOf":"font-feature-settings"},"-moz-font-feature-settings":{"_aliasOf":"font-feature-settings"},"-webkit-font-kerning":{"_aliasOf":"font-kerning"},"-moz-font-language-override":{"_aliasOf":"font-language-override"},"-webkit-font-smoothing":{"_aliasOf":"font-smooth"},"-moz-osx-font-smoothing":{"_aliasOf":"font-smooth"},"-webkit-font-variant-ligatures":{"_aliasOf":"font-variant-ligatures"},"-ms-high-contrast-adjust":{"_aliasOf":"forced-color-adjust"},"-ms-grid-columns":{"_aliasOf":"grid-template-columns"},"-ms-grid-rows":{"_aliasOf":"grid-template-rows"},"-webkit-hyphenate-character":{"_aliasOf":"hyphenate-character"},"-webkit-hyphens":{"_aliasOf":"hyphens"},"-ms-hyphens":{"_aliasOf":"hyphens"},"-moz-hyphens":{"_aliasOf":"hyphens"},"-ms-ime-mode":{"_aliasOf":"ime-mode"},"-webkit-initial-letter":{"_aliasOf":"initial-letter"},"offset-block":{"_aliasOf":"inset-block"},"offset-block-end":{"_aliasOf":"inset-block-end"},"offset-block-start":{"_aliasOf":"inset-block-start"},"offset-inline":{"_aliasOf":"inset-inline"},"offset-inline-end":{"_aliasOf":"inset-inline-end"},"offset-inline-start":{"_aliasOf":"inset-inline-start"},"-webkit-justify-content":{"_aliasOf":"justify-content"},"-webkit-line-break":{"_aliasOf":"line-break"},"-ms-line-break":{"_aliasOf":"line-break"},"-khtml-line-break":{"_aliasOf":"line-break"},"-webkit-line-clamp":{"_aliasOf":"line-clamp"},"-webkit-margin-end":{"_aliasOf":"margin-inline-end"},"-moz-margin-end":{"_aliasOf":"margin-inline-end"},"-webkit-margin-start":{"_aliasOf":"margin-inline-start"},"-moz-margin-start":{"_aliasOf":"margin-inline-start"},"-webkit-mask":{"_aliasOf":"mask"},"-webkit-mask-box-image-outset":{"_aliasOf":"mask-border-outset"},"-webkit-mask-box-image-repeat":{"_aliasOf":"mask-border-repeat"},"-webkit-mask-box-image-slice":{"_aliasOf":"mask-border-slice"},"-webkit-mask-box-image-source":{"_aliasOf":"mask-border-source"},"-webkit-mask-box-image-width":{"_aliasOf":"mask-border-width"},"-webkit-mask-clip":{"_aliasOf":"mask-clip"},"-webkit-mask-image":{"_aliasOf":"mask-image"},"-webkit-mask-origin":{"_aliasOf":"mask-origin"},"-webkit-mask-position":{"_aliasOf":"mask-position"},"-webkit-mask-repeat":{"_aliasOf":"mask-repeat"},"-webkit-mask-size":{"_aliasOf":"mask-size"},"-webkit-max-inline-size":{"_aliasOf":"max-inline-size"},"-o-object-fit":{"_aliasOf":"object-fit"},"-o-object-position":{"_aliasOf":"object-position"},"motion":{"_aliasOf":"offset"},"motion-distance":{"_aliasOf":"offset-distance"},"motion-path":{"_aliasOf":"offset-path"},"offset-rotation":{"_aliasOf":"offset-rotate"},"motion-rotation":{"_aliasOf":"offset-rotate"},"-moz-opacity":{"_aliasOf":"opacity"},"-khtml-opacity":{"_aliasOf":"opacity"},"-webkit-order":{"_aliasOf":"order"},"-ms-order":{"_aliasOf":"order"},"-moz-outline":{"_aliasOf":"outline"},"-moz-outline-color":{"_aliasOf":"outline-color"},"-moz-outline-style":{"_aliasOf":"outline-style"},"-moz-outline-width":{"_aliasOf":"outline-width"},"word-wrap":{"_aliasOf":"overflow-wrap"},"-ms-overflow-x":{"_aliasOf":"overflow-x"},"-ms-overflow-y":{"_aliasOf":"overflow-y"},"-webkit-padding-end":{"_aliasOf":"padding-inline-end"},"-moz-padding-end":{"_aliasOf":"padding-inline-end"},"-webkit-padding-start":{"_aliasOf":"padding-inline-start"},"-moz-padding-start":{"_aliasOf":"padding-inline-start"},"-webkit-perspective":{"_aliasOf":"perspective"},"-moz-perspective":{"_aliasOf":"perspective"},"-webkit-perspective-origin":{"_aliasOf":"perspective-origin"},"-moz-perspective-origin":{"_aliasOf":"perspective-origin"},"inset-area":{"_aliasOf":"position-area"},"position-try-options":{"_aliasOf":"position-try-fallbacks"},"-webkit-print-color-adjust":{"_aliasOf":"print-color-adjust"},"-webkit-ruby-position":{"_aliasOf":"ruby-position"},"scroll-snap-margin":{"_aliasOf":"scroll-margin"},"scroll-snap-margin-bottom":{"_aliasOf":"scroll-margin-bottom"},"scroll-snap-margin-left":{"_aliasOf":"scroll-margin-left"},"scroll-snap-margin-right":{"_aliasOf":"scroll-margin-right"},"scroll-snap-margin-top":{"_aliasOf":"scroll-margin-top"},"-ms-scroll-snap-type":{"_aliasOf":"scroll-snap-type"},"-webkit-scroll-snap-type":{"_aliasOf":"scroll-snap-type"},"-webkit-shape-margin":{"_aliasOf":"shape-margin"},"-moz-tab-size":{"_aliasOf":"tab-size"},"-o-tab-size":{"_aliasOf":"tab-size"},"-moz-text-align-last":{"_aliasOf":"text-align-last"},"-ms-text-combine-horizontal":{"_aliasOf":"text-combine-upright"},"-moz-text-decoration-color":{"_aliasOf":"text-decoration-color"},"-webkit-text-decoration-color":{"_aliasOf":"text-decoration-color"},"-moz-text-decoration-line":{"_aliasOf":"text-decoration-line"},"-webkit-text-decoration-line":{"_aliasOf":"text-decoration-line"},"-webkit-text-decoration-skip":{"_aliasOf":"text-decoration-skip"},"-moz-text-decoration-style":{"_aliasOf":"text-decoration-style"},"-webkit-text-decoration-style":{"_aliasOf":"text-decoration-style"},"-webkit-text-emphasis":{"_aliasOf":"text-emphasis"},"-webkit-text-emphasis-color":{"_aliasOf":"text-emphasis-color"},"-webkit-text-emphasis-position":{"_aliasOf":"text-emphasis-position"},"-webkit-text-emphasis-style":{"_aliasOf":"text-emphasis-style"},"-webkit-text-orientation":{"_aliasOf":"text-orientation"},"-ms-text-overflow":{"_aliasOf":"text-overflow"},"-o-text-overflow":{"_aliasOf":"text-overflow"},"-webkit-text-size-adjust":{"_aliasOf":"text-size-adjust"},"-moz-text-size-adjust":{"_aliasOf":"text-size-adjust"},"-webkit-text-underline-position":{"_aliasOf":"text-underline-position"},"-ms-touch-action":{"_aliasOf":"touch-action"},"-webkit-transform":{"_aliasOf":"transform"},"-moz-transform":{"_aliasOf":"transform"},"-ms-transform":{"_aliasOf":"transform"},"-o-transform":{"_aliasOf":"transform"},"-webkit-transform-origin":{"_aliasOf":"transform-origin"},"-moz-transform-origin":{"_aliasOf":"transform-origin"},"-ms-transform-origin":{"_aliasOf":"transform-origin"},"-o-transform-origin":{"_aliasOf":"transform-origin"},"-webkit-transform-style":{"_aliasOf":"transform-style"},"-moz-transform-style":{"_aliasOf":"transform-style"},"-webkit-transition":{"_aliasOf":"transition"},"-moz-transition":{"_aliasOf":"transition"},"-ms-transition":{"_aliasOf":"transition"},"-o-transition":{"_aliasOf":"transition"},"-webkit-transition-delay":{"_aliasOf":"transition-delay"},"-moz-transition-delay":{"_aliasOf":"transition-delay"},"-ms-transition-delay":{"_aliasOf":"transition-delay"},"-o-transition-delay":{"_aliasOf":"transition-delay"},"-webkit-transition-duration":{"_aliasOf":"transition-duration"},"-moz-transition-duration":{"_aliasOf":"transition-duration"},"-ms-transition-duration":{"_aliasOf":"transition-duration"},"-o-transition-duration":{"_aliasOf":"transition-duration"},"-webkit-transition-property":{"_aliasOf":"transition-property"},"-moz-transition-property":{"_aliasOf":"transition-property"},"-ms-transition-property":{"_aliasOf":"transition-property"},"-o-transition-property":{"_aliasOf":"transition-property"},"-webkit-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-moz-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-ms-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-o-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-webkit-user-modify":{"_aliasOf":"user-modify"},"-moz-user-modify":{"_aliasOf":"user-modify"},"-khtml-user-modify":{"_aliasOf":"user-modify"},"-webkit-user-select":{"_aliasOf":"user-select"},"-ms-user-select":{"_aliasOf":"user-select"},"-moz-user-select":{"_aliasOf":"user-select"},"-khtml-user-select":{"_aliasOf":"user-select"},"-ms-word-break":{"_aliasOf":"word-break"},"-webkit-writing-mode":{"_aliasOf":"writing-mode"},"-ms-writing-mode":{"_aliasOf":"writing-mode"}} \ No newline at end of file diff --git a/docs/config.yml b/docs/config.yml index c9da2ea8608..544c94c4681 100644 --- a/docs/config.yml +++ b/docs/config.yml @@ -97,6 +97,7 @@ categories: redirects: browser/browser: browser + browser/components/newtab/docs/index.html: browser/extensions/newtab/docs/index.html contributing/how_to_contribute_firefox.html: contributing/contribution_quickref.html contributing/artifact_builds.html: contributing/build/artifact_builds.html contributing/linux_build.html: setup/linux_build.html diff --git a/docshell/base/BrowsingContext.h b/docshell/base/BrowsingContext.h index 7ded624c385..5823cf8e1dd 100644 --- a/docshell/base/BrowsingContext.h +++ b/docshell/base/BrowsingContext.h @@ -224,9 +224,6 @@ struct EmbedderColorSchemes { * This is only ever set to true on the top BC, so consumers need to get \ * the value from the top BC! */ \ FIELD(HasSessionHistory, bool) \ - /* Tracks if this context is the only top-level document in the session \ - * history of the context. */ \ - FIELD(IsSingleToplevelInHistory, bool) \ FIELD(UseErrorPages, bool) \ FIELD(PlatformOverride, nsString) \ /* Specifies if this BC has loaded documents besides the initial \ diff --git a/docshell/base/CanonicalBrowsingContext.cpp b/docshell/base/CanonicalBrowsingContext.cpp index a9ff63156be..efcf377f326 100644 --- a/docshell/base/CanonicalBrowsingContext.cpp +++ b/docshell/base/CanonicalBrowsingContext.cpp @@ -1301,7 +1301,6 @@ void CanonicalBrowsingContext::ReplaceActiveSessionHistoryEntry( nsSHistory* shistory = static_cast(GetSessionHistory()); if (shistory) { shistory->NotifyOnHistoryReplaceEntry(); - shistory->UpdateRootBrowsingContextState(); } ResetSHEntryHasUserInteractionCache(); diff --git a/docshell/shistory/nsISHistory.idl b/docshell/shistory/nsISHistory.idl index c579655ddb7..49251d789a6 100644 --- a/docshell/shistory/nsISHistory.idl +++ b/docshell/shistory/nsISHistory.idl @@ -287,8 +287,6 @@ interface nsISHistory: nsISupports [noscript] void AddChildSHEntryHelper(in nsISHEntry aCloneRef, in nsISHEntry aNewEntry, in BrowsingContext aRootBC, in boolean aCloneChildren); - [noscript, notxpcom] boolean isEmptyOrHasEntriesForSingleTopLevelPage(); - /** * Determine if we can navigate back in history from the entry at aIndex * to an entry that has user interaction. diff --git a/docshell/shistory/nsSHistory.cpp b/docshell/shistory/nsSHistory.cpp index 659d3b3eaf5..e051cd66305 100644 --- a/docshell/shistory/nsSHistory.cpp +++ b/docshell/shistory/nsSHistory.cpp @@ -784,17 +784,6 @@ void nsSHistory::HandleEntriesToSwapInDocShell( } } -void nsSHistory::UpdateRootBrowsingContextState(BrowsingContext* aRootBC) { - if (aRootBC && aRootBC->EverAttached()) { - bool sameDocument = IsEmptyOrHasEntriesForSingleTopLevelPage(); - if (sameDocument != aRootBC->GetIsSingleToplevelInHistory()) { - // If the browsing context is discarded then its session history is - // invalid and will go away. - Unused << aRootBC->SetIsSingleToplevelInHistory(sameDocument); - } - } -} - NS_IMETHODIMP nsSHistory::AddToRootSessionHistory(bool aCloneChildren, nsISHEntry* aOSHE, BrowsingContext* aRootBC, @@ -883,7 +872,6 @@ nsSHistory::AddEntry(nsISHEntry* aSHEntry, bool aPersist) { NotifyListeners(mListeners, [](auto l) { l->OnHistoryReplaceEntry(); }); aSHEntry->SetPersist(aPersist); mEntries[mIndex] = aSHEntry; - UpdateRootBrowsingContextState(); return NS_OK; } } @@ -915,8 +903,6 @@ nsSHistory::AddEntry(nsISHEntry* aSHEntry, bool aPersist) { PurgeHistory(Length() - gHistoryMaxSize); } - UpdateRootBrowsingContextState(); - return NS_OK; } @@ -1150,8 +1136,6 @@ nsSHistory::PurgeHistory(int32_t aNumEntries) { rootBC->GetDocShell()->HistoryPurged(aNumEntries); } - UpdateRootBrowsingContextState(rootBC); - return NS_OK; } @@ -1213,8 +1197,6 @@ nsSHistory::ReplaceEntry(int32_t aIndex, nsISHEntry* aReplaceEntry) { aReplaceEntry->SetPersist(true); mEntries[aIndex] = aReplaceEntry; - UpdateRootBrowsingContextState(); - return NS_OK; } @@ -2026,8 +2008,6 @@ void nsSHistory::RemoveEntries(nsTArray& aIDs, int32_t aStartIndex, } --index; } - - UpdateRootBrowsingContextState(); } void nsSHistory::RemoveFrameEntries(nsISHEntry* aEntry) { @@ -2417,25 +2397,6 @@ nsSHistory::CreateEntry(nsISHEntry** aEntry) { return NS_OK; } -NS_IMETHODIMP_(bool) -nsSHistory::IsEmptyOrHasEntriesForSingleTopLevelPage() { - if (mEntries.IsEmpty()) { - return true; - } - - nsISHEntry* entry = mEntries[0]; - size_t length = mEntries.Length(); - for (size_t i = 1; i < length; ++i) { - bool sharesDocument = false; - mEntries[i]->SharesDocumentWith(entry, &sharesDocument); - if (!sharesDocument) { - return false; - } - } - - return true; -} - static void CollectEntries( nsTHashMap& aHashtable, SessionHistoryEntry* aEntry) { diff --git a/docshell/shistory/nsSHistory.h b/docshell/shistory/nsSHistory.h index fac7fb0ad48..b35ed6084d8 100644 --- a/docshell/shistory/nsSHistory.h +++ b/docshell/shistory/nsSHistory.h @@ -189,7 +189,6 @@ class nsSHistory : public mozilla::LinkedListElement, uint64_t newID = aRootBC ? aRootBC->Id() : 0; if (mRootBC != newID) { mRootBC = newID; - UpdateRootBrowsingContextState(aRootBC); } } @@ -200,13 +199,6 @@ class nsSHistory : public mozilla::LinkedListElement, return mRequestedIndex == -1 ? mIndex : mRequestedIndex; } - // Update the root browsing context state when adding, removing or - // replacing entries. - void UpdateRootBrowsingContextState() { - RefPtr rootBC(GetBrowsingContext()); - UpdateRootBrowsingContextState(rootBC); - } - void GetEpoch(uint64_t& aEpoch, mozilla::Maybe& aId) const { aEpoch = mEpoch; @@ -228,9 +220,6 @@ class nsSHistory : public mozilla::LinkedListElement, private: friend class nsSHistoryObserver; - void UpdateRootBrowsingContextState( - mozilla::dom::BrowsingContext* aBrowsingContext); - bool LoadDifferingEntries(nsISHEntry* aPrevEntry, nsISHEntry* aNextEntry, mozilla::dom::BrowsingContext* aParent, long aLoadType, diff --git a/docshell/test/browser/browser.toml b/docshell/test/browser/browser.toml index 87ac76d142d..e58b79927b1 100644 --- a/docshell/test/browser/browser.toml +++ b/docshell/test/browser/browser.toml @@ -151,7 +151,10 @@ https_first_disabled = true ["browser_bug388121-2.js"] ["browser_bug420605.js"] -skip-if = ["verify"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775923 + "verify", +] ["browser_bug422543.js"] https_first_disabled = true diff --git a/dom/animation/Animation.cpp b/dom/animation/Animation.cpp index be6373c86f6..5281d20621d 100644 --- a/dom/animation/Animation.cpp +++ b/dom/animation/Animation.cpp @@ -846,6 +846,17 @@ void Animation::CommitStyles(ErrorResult& aRv) { return; } + // Count how often the endpoint-inclusive behavior makes a difference so we + // can gauge if it is Web-compatible. + auto computedTimingWithEndpointIncluded = + keyframeEffect->GetComputedTiming(nullptr, EndpointBehavior::Inclusive); + auto computedTimingWithEndpointExcluded = + keyframeEffect->GetComputedTiming(nullptr, EndpointBehavior::Exclusive); + if (computedTimingWithEndpointIncluded.mProgress != + computedTimingWithEndpointExcluded.mProgress) { + doc->SetUseCounter(eUseCounter_custom_CommitStylesNonFillingFinalValue); + } + // Calling SetCSSDeclaration will trigger attribute setting code. // Start the update now so that the old rule doesn't get used // between when we mutate the declaration and when we set the new @@ -1382,7 +1393,7 @@ static TimeStamp EnsurePaintIsScheduled(Document& aDoc) { if (!rd->IsInRefresh()) { return {}; } - return rd->MostRecentRefresh(/* aEnsureTimerStarted = */ false); + return rd->MostRecentRefresh(); } // https://drafts.csswg.org/web-animations/#play-an-animation @@ -1697,7 +1708,8 @@ void Animation::UpdateEffect(PostRestyleMode aPostRestyle) { void Animation::FlushUnanimatedStyle() const { if (Document* doc = GetRenderedDocument()) { doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Style, false /* flush animations */)); + ChangesToFlush(FlushType::Style, /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ false)); } } diff --git a/dom/animation/CSSAnimation.cpp b/dom/animation/CSSAnimation.cpp index a112eb21154..d8d85c3bd4b 100644 --- a/dom/animation/CSSAnimation.cpp +++ b/dom/animation/CSSAnimation.cpp @@ -367,7 +367,7 @@ void CSSAnimationKeyframeEffect::MaybeFlushUnanimatedStyle() const { if (dom::Document* doc = GetRenderedDocument()) { doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Style, false /* flush animations */)); + ChangesToFlush(FlushType::Style, false /* flush animations */, false)); } } diff --git a/dom/base/ChromeUtils.cpp b/dom/base/ChromeUtils.cpp index 0e73fd32f4c..bd6dd143216 100644 --- a/dom/base/ChromeUtils.cpp +++ b/dom/base/ChromeUtils.cpp @@ -2585,4 +2585,11 @@ void ChromeUtils::AndroidMoveTaskToBack(GlobalObject& aGlobal) { #endif } +already_AddRefed ChromeUtils::CreateCSPFromHeader( + GlobalObject& aGlobal, const nsAString& aHeader, nsIURI* aSelfURI, + nsIPrincipal* aLoadingPrincipal, ErrorResult& aRv) { + return CSP_CreateFromHeader(aHeader, aSelfURI, aLoadingPrincipal, + aRv); +} + } // namespace mozilla::dom diff --git a/dom/base/ChromeUtils.h b/dom/base/ChromeUtils.h index 7c700415831..bb5a5721ac3 100644 --- a/dom/base/ChromeUtils.h +++ b/dom/base/ChromeUtils.h @@ -331,6 +331,10 @@ class ChromeUtils { static void AndroidMoveTaskToBack(GlobalObject& aGlobal); + static already_AddRefed CreateCSPFromHeader( + GlobalObject& aGlobal, const nsAString& aHeader, nsIURI* aSelfURI, + nsIPrincipal* aLoadingPrincipal, ErrorResult& aRv); + private: // Number of DevTools session debugging the current process static std::atomic sDevToolsOpenedCount; diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp index ce95a815d14..ea3ebd551af 100644 --- a/dom/base/Document.cpp +++ b/dom/base/Document.cpp @@ -11376,7 +11376,8 @@ already_AddRefed Document::CreateEvent(const nsAString& aEventType, } void Document::FlushPendingNotifications(FlushType aType) { - mozilla::ChangesToFlush flush(aType, aType >= FlushType::Style); + mozilla::ChangesToFlush flush(aType, aType >= FlushType::Style, + aType >= FlushType::Layout); FlushPendingNotifications(flush); } @@ -17308,7 +17309,7 @@ void Document::UpdateLastRememberedSizes() { mElementsObservedForLastRememberedSize.Remove(it); continue; } - const auto element = *it; + auto* element = *it; MOZ_ASSERT(element->GetComposedDoc() == this); nsIFrame* frame = element->GetPrimaryFrame(); MOZ_ASSERT(frame); @@ -18097,7 +18098,7 @@ void Document::DetermineProximityToViewportAndNotifyResizeObservers() { bool initialResetOfScrolledIntoViewFlagsDone = false; const ChangesToFlush ctf( interruptible ? FlushType::InterruptibleLayout : FlushType::Layout, - /* aFlushAnimations = */ false); + /* aFlushAnimations = */ false, /* aUpdateRelevancy = */ false); // 2. While true: while (true) { diff --git a/dom/base/DocumentOrShadowRoot.cpp b/dom/base/DocumentOrShadowRoot.cpp index 5c29728f4b5..324d250517e 100644 --- a/dom/base/DocumentOrShadowRoot.cpp +++ b/dom/base/DocumentOrShadowRoot.cpp @@ -605,7 +605,8 @@ void DocumentOrShadowRoot::GetAnimations( // structure while iterating over the children below. if (Document* doc = AsNode().GetComposedDoc()) { doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Style, false /* flush animations */)); + ChangesToFlush(FlushType::Style, /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ false)); } GetAnimationsOptions options; diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp index 970a0fe5673..3243dbfd31d 100644 --- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -4125,7 +4125,8 @@ void Element::GetAnimations(const GetAnimationsOptions& aOptions, // be reflected in the flags passed in DocumentOrShadowRoot::GetAnimations // too. doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Style, false /* flush animations */)); + ChangesToFlush(FlushType::Style, /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ false)); } GetAnimationsWithoutFlush(aOptions, aAnimations); diff --git a/dom/base/FlushType.h b/dom/base/FlushType.h index c90cbbd16fa..461cf580e26 100644 --- a/dom/base/FlushType.h +++ b/dom/base/FlushType.h @@ -58,11 +58,17 @@ const EnumeratedArray // clang-format on struct ChangesToFlush { - ChangesToFlush(FlushType aFlushType, bool aFlushAnimations) - : mFlushType(aFlushType), mFlushAnimations(aFlushAnimations) {} + ChangesToFlush(FlushType aFlushType, bool aFlushAnimations, + bool aUpdateRelevancy) + : mFlushType(aFlushType), + mFlushAnimations(aFlushAnimations), + mUpdateRelevancy(aUpdateRelevancy) { + MOZ_ASSERT_IF(mUpdateRelevancy, mFlushType >= FlushType::Layout); + } FlushType mFlushType; bool mFlushAnimations; + bool mUpdateRelevancy; }; } // namespace mozilla diff --git a/dom/base/Nyx.cpp b/dom/base/Nyx.cpp index ca840eb6079..b7057536275 100644 --- a/dom/base/Nyx.cpp +++ b/dom/base/Nyx.cpp @@ -48,34 +48,22 @@ void Nyx::Release(const GlobalObject&, uint32_t aIterations) { /* static */ void Nyx::GetRawData(const GlobalObject& aGlobal, JS::MutableHandle aRetval, ErrorResult& aRv) { - const size_t maxMsgSize = 4096; - - FallibleTArray data; - - // Allocate memory for the buffer - if (!data.SetLength(maxMsgSize, fallible)) { - MOZ_FUZZING_NYX_ABORT("ERROR: Failed to initialize buffer!\n"); + uint8_t* buf = nullptr; + uint32_t size = fuzzing::Nyx::instance().get_raw_data(&buf); + if (buf == nullptr) { + MOZ_FUZZING_NYX_PRINT("ERROR: Failed to get pointer to global payload.\n"); } - // Retrieve raw data into the buffer - uint32_t bufsize = - fuzzing::Nyx::instance().get_raw_data(data.Elements(), data.Length()); + auto* cx = aGlobal.Context(); + JS::Rooted arrayBuffer( + cx, JS::NewArrayBufferWithUserOwnedContents(cx, size, buf)); - if (!data.SetLength(bufsize, fallible)) { - MOZ_FUZZING_NYX_ABORT("ERROR: Failed to resize buffer!\n"); - } - - if (bufsize == 0xFFFFFFFF) { - MOZ_FUZZING_NYX_DEBUG("Nyx: Out of data.\n"); - fuzzing::Nyx::instance().release(0); - } - - JS::Rooted buffer( - aGlobal.Context(), ArrayBuffer::Create(aGlobal.Context(), data, aRv)); - if (aRv.Failed()) { + if (!arrayBuffer) { + MOZ_FUZZING_NYX_PRINT("ERROR: Failed to create ArrayBuffer.\n"); return; } - aRetval.set(buffer); + + aRetval.set(arrayBuffer); } } // namespace mozilla::dom diff --git a/dom/base/UseCounters.conf b/dom/base/UseCounters.conf index 0ae0be2dff9..c084eda9f7f 100644 --- a/dom/base/UseCounters.conf +++ b/dom/base/UseCounters.conf @@ -391,6 +391,10 @@ custom DocumentQueryCommandStateOrValueInsertBrOnReturn calls queryCommandState custom DocumentQueryCommandSupportedOrEnabledContentReadOnly calls queryCommandSupported or queryCommandEnabled with contentReadOnly custom DocumentQueryCommandSupportedOrEnabledInsertBrOnReturn calls queryCommandSupported or queryCommandEnabled with insertBrOnReturn +// Web Animations +method Animation.commitStyles +custom CommitStylesNonFillingFinalValue calls commitStyles and its result differs depending on whether the endpoint-inclusive pref is enabled or not + // SVG filters custom feBlend uses the feBlend SVG filter. custom feColorMatrix uses the feColorMatrix SVG filter. diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index eba6b032314..44b5f278a6d 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -1919,33 +1919,6 @@ nsIBidiKeyboard* nsContentUtils::GetBidiKeyboard() { return sBidiKeyboard; } -/** - * This is used to determine whether a character is in one of the classes - * which CSS says should be part of the first-letter. Currently, that is - * all punctuation classes (P*). Note that this is a change from CSS2 - * which excluded Pc and Pd. - * - * https://www.w3.org/TR/css-pseudo-4/#first-letter-pseudo - * "Punctuation (i.e, characters that belong to the Punctuation (P*) Unicode - * general category [UAX44]) [...]" - */ - -// static -bool nsContentUtils::IsFirstLetterPunctuation(uint32_t aChar) { - switch (mozilla::unicode::GetGeneralCategory(aChar)) { - case HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION: /* Pc */ - case HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION: /* Pd */ - case HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION: /* Pe */ - case HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION: /* Pf */ - case HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION: /* Pi */ - case HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION: /* Po */ - case HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION: /* Ps */ - return true; - default: - return false; - } -} - // static bool nsContentUtils::IsAlphanumeric(uint32_t aChar) { nsUGenCategory cat = mozilla::unicode::GetGenCategory(aChar); diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h index 96044e9c8c4..e8acff918e3 100644 --- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -809,11 +809,6 @@ class nsContentUtils { static const nsDependentSubstring TrimWhitespace(const nsAString& aStr, bool aTrimTrailing = true); - /** - * Returns true if aChar is of class Ps, Pi, Po, Pf, or Pe. - */ - static bool IsFirstLetterPunctuation(uint32_t aChar); - /** * Returns true if aChar is of class Lu, Ll, Lt, Lm, Lo, Nd, Nl or No */ diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp index ef82ecc59cc..b6e01b586e7 100644 --- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -418,12 +418,8 @@ nsDOMWindowUtils::GetDocumentMetadata(const nsAString& aName, NS_IMETHODIMP nsDOMWindowUtils::UpdateLayerTree() { + FlushLayoutWithoutThrottledAnimations(); if (RefPtr presShell = GetPresShell()) { - // Don't flush throttled animations since it might fire MozAfterPaint event - // (in WebRender it constantly does), thus the reftest harness can't take - // any snapshot until the throttled animations finished. - presShell->FlushPendingNotifications( - ChangesToFlush(FlushType::Layout, false /* flush animations */)); RefPtr vm = presShell->GetViewManager(); if (nsView* view = vm->GetRootView()) { nsAutoScriptBlocker scriptBlocker; @@ -2172,12 +2168,11 @@ nsDOMWindowUtils::NeedsFlush(int32_t aFlushType, bool* aResult) { NS_IMETHODIMP nsDOMWindowUtils::FlushLayoutWithoutThrottledAnimations() { - nsCOMPtr doc = GetDocument(); - if (doc) { + if (nsCOMPtr doc = GetDocument()) { doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Layout, false /* flush animations */)); + ChangesToFlush(FlushType::Layout, /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ true)); } - return NS_OK; } diff --git a/dom/base/nsGlobalWindowOuter.cpp b/dom/base/nsGlobalWindowOuter.cpp index e9afd67f18e..cd75485b736 100644 --- a/dom/base/nsGlobalWindowOuter.cpp +++ b/dom/base/nsGlobalWindowOuter.cpp @@ -5920,9 +5920,12 @@ void nsGlobalWindowOuter::CloseOuter(bool aTrustedCaller) { nsresult rv = mDoc->GetURL(url); NS_ENSURE_SUCCESS_VOID(rv); + RefPtr csh = + nsDocShell::Cast(mDocShell)->GetSessionHistory(); + if (!StringBeginsWith(url, u"about:neterror"_ns) && !mBrowsingContext->GetTopLevelCreatedByWebContent() && - !aTrustedCaller && !IsOnlyTopLevelDocumentInSHistory()) { + !aTrustedCaller && csh && csh->Count() > 1) { bool allowClose = mAllowScriptsToClose || Preferences::GetBool("dom.allow_scripts_to_close_windows", true); @@ -5965,23 +5968,6 @@ void nsGlobalWindowOuter::CloseOuter(bool aTrustedCaller) { FinalClose(); } -bool nsGlobalWindowOuter::IsOnlyTopLevelDocumentInSHistory() { - NS_ENSURE_TRUE(mDocShell && mBrowsingContext, false); - // Disabled since IsFrame() is buggy in Fission - // MOZ_ASSERT(mBrowsingContext->IsTop()); - - if (mozilla::SessionHistoryInParent()) { - return mBrowsingContext->GetIsSingleToplevelInHistory(); - } - - RefPtr csh = nsDocShell::Cast(mDocShell)->GetSessionHistory(); - if (csh && csh->LegacySHistory()) { - return csh->LegacySHistory()->IsEmptyOrHasEntriesForSingleTopLevelPage(); - } - - return false; -} - nsresult nsGlobalWindowOuter::Close() { CloseOuter(/* aTrustedCaller = */ true); return NS_OK; diff --git a/dom/base/nsGlobalWindowOuter.h b/dom/base/nsGlobalWindowOuter.h index 7b953f28cab..a846e57a878 100644 --- a/dom/base/nsGlobalWindowOuter.h +++ b/dom/base/nsGlobalWindowOuter.h @@ -965,8 +965,6 @@ class nsGlobalWindowOuter final : public mozilla::dom::EventTarget, void MaybeAllowStorageForOpenedWindow(nsIURI* aURI); - bool IsOnlyTopLevelDocumentInSHistory(); - void MaybeResetWindowName(Document* aNewDocument); public: diff --git a/dom/base/test/browser.toml b/dom/base/test/browser.toml index 1944a54445a..89d4183bbd2 100644 --- a/dom/base/test/browser.toml +++ b/dom/base/test/browser.toml @@ -74,6 +74,7 @@ skip-if = [ "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && opt && socketprocess_networking", # Bug 1775696 "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1775696 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1775696 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775696 "os == 'mac' && os_version == '14.70' && processor == 'x86_64' && debug", # Bug 1929448 ] @@ -109,6 +110,7 @@ skip-if = ["true"] # Fails with Fission, and we're unlikely to spend time to fix skip-if = [ "os == 'win' && opt", # Bug 1505235 "os == 'mac' && os_version == '10.15' && processor == 'x86_64'", # Bug 1661132 (osx), Bug 1866073 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1661132 (osx) "socketprocess_networking", ] support-files = ["browser_multiple_popups.html"] diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml index cfbec41114c..5f16098f42a 100644 --- a/dom/base/use_counter_metrics.yaml +++ b/dom/base/use_counter_metrics.yaml @@ -107,8 +107,8 @@ use.counter: send_in_pings: - use-counters -# Total of 2391 use counter metrics (excludes denominators). -# Total of 355 'page' use counters. +# Total of 2395 use counter metrics (excludes denominators). +# Total of 357 'page' use counters. use.counter.page: svgsvgelement_getelementbyid: type: counter @@ -5295,6 +5295,40 @@ use.counter.page: send_in_pings: - use-counters + animation_commitstyles: + type: counter + description: > + Whether a page called called Animation.commitStyles. + Compare against `use.counter.top_level_content_documents_destroyed` + to calculate the rate. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + notification_emails: + - dom-core@mozilla.com + - emilio@mozilla.com + expires: never + send_in_pings: + - use-counters + + commit_styles_non_filling_final_value: + type: counter + description: > + Whether a page calls commitStyles and its result differs depending on whether the endpoint-inclusive pref is enabled or not. + Compare against `use.counter.top_level_content_documents_destroyed` + to calculate the rate. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + notification_emails: + - dom-core@mozilla.com + - emilio@mozilla.com + expires: never + send_in_pings: + - use-counters + fe_blend: type: counter description: > @@ -6145,7 +6179,7 @@ use.counter.page: send_in_pings: - use-counters -# Total of 355 'document' use counters. +# Total of 357 'document' use counters. use.counter.doc: svgsvgelement_getelementbyid: type: counter @@ -11332,6 +11366,40 @@ use.counter.doc: send_in_pings: - use-counters + animation_commitstyles: + type: counter + description: > + Whether a document called called Animation.commitStyles. + Compare against `use.counter.content_documents_destroyed` + to calculate the rate. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + notification_emails: + - dom-core@mozilla.com + - emilio@mozilla.com + expires: never + send_in_pings: + - use-counters + + commit_styles_non_filling_final_value: + type: counter + description: > + Whether a document calls commitStyles and its result differs depending on whether the endpoint-inclusive pref is enabled or not. + Compare against `use.counter.content_documents_destroyed` + to calculate the rate. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + notification_emails: + - dom-core@mozilla.com + - emilio@mozilla.com + expires: never + send_in_pings: + - use-counters + fe_blend: type: counter description: > diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp index 6035ea8629c..e810c3e4f31 100644 --- a/dom/canvas/CanvasRenderingContext2D.cpp +++ b/dom/canvas/CanvasRenderingContext2D.cpp @@ -2143,25 +2143,10 @@ UniquePtr CanvasRenderingContext2D::GetImageBuffer( mBufferProvider->ReturnSnapshot(snapshot.forget()); if (ret && ShouldResistFingerprinting(RFPTarget::CanvasRandomization)) { - bool randomize = true; - // Skip randomization if we are doing user characteristics data collection. - // During data collection, we'll 1) set the pref to true 2) be in the main - // thread and 3) be in chrome code (JS Window Actor). - if (StaticPrefs:: - privacy_resistFingerprinting_randomization_canvas_disable_for_chrome()) { - bool isCallerChrome = - NS_IsMainThread() && nsContentUtils::IsCallerChrome(); - if (isCallerChrome) { - randomize = false; - } - } - if (randomize) { - nsRFPService::RandomizePixels( - GetCookieJarSettings(), ret.get(), out_imageSize->width, - out_imageSize->height, - out_imageSize->width * out_imageSize->height * 4, - SurfaceFormat::A8R8G8B8_UINT32); - } + nsRFPService::RandomizePixels( + GetCookieJarSettings(), ret.get(), out_imageSize->width, + out_imageSize->height, out_imageSize->width * out_imageSize->height * 4, + SurfaceFormat::A8R8G8B8_UINT32); } return ret; diff --git a/dom/chrome-webidl/ChromeUtils.webidl b/dom/chrome-webidl/ChromeUtils.webidl index e0d953da57a..1fd0519864c 100644 --- a/dom/chrome-webidl/ChromeUtils.webidl +++ b/dom/chrome-webidl/ChromeUtils.webidl @@ -788,6 +788,9 @@ partial namespace ChromeUtils { // Equivalent to pressing the home button. Exclusively for testing. [ChromeOnly] undefined androidMoveTaskToBack(); + + [Throws] + ContentSecurityPolicy createCSPFromHeader(DOMString header, URI selfURI, Principal loadingPrincipal); }; /* diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp index a37fe4feb95..13deaabfff0 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -6618,6 +6618,8 @@ void EventStateManager::ContentRemoved(Document* aDocument, entry.GetData()->ContentRemoved(*aContent); } } + + NotifyContentWillBeRemovedForGesture(*aContent); } void EventStateManager::TextControlRootWillBeRemoved( @@ -7505,24 +7507,24 @@ bool EventStateManager::WheelPrefs::IsOverOnePageScrollAllowedY( MIN_MULTIPLIER_VALUE_ALLOWING_OVER_ONE_PAGE_SCROLL; } -void EventStateManager::NotifyDestroyingFrameForGesture(nsIFrame* aFrame) { - MOZ_ASSERT(aFrame); - if (mGestureDownContent != aFrame->GetContent()) { +void EventStateManager::NotifyContentWillBeRemovedForGesture( + nsIContent& aContent) { + if (!mGestureDownContent) { return; } - if (nsIFrame* parent = aFrame->GetParent()) { - nsIFrame* f = nsLayoutUtils::GetNonGeneratedAncestor(parent); - MOZ_ASSERT(f); - - nsIContent* content = f->GetContent(); - mGestureDownContent = content; - mGestureDownFrameOwner = content; - mGestureDownInTextControl = - content && content->IsInNativeAnonymousSubtree() && - TextControlElement::FromNodeOrNull( - content->GetClosestNativeAnonymousSubtreeRootParentOrHost()); + if (!nsContentUtils::ContentIsFlattenedTreeDescendantOf(mGestureDownContent, + &aContent)) { + return; } + + nsIContent* parent = aContent.GetFlattenedTreeParent(); + mGestureDownContent = parent; + mGestureDownFrameOwner = parent; + mGestureDownInTextControl = + parent && parent->IsInNativeAnonymousSubtree() && + TextControlElement::FromNodeOrNull( + parent->GetClosestNativeAnonymousSubtreeRootParentOrHost()); } } // namespace mozilla diff --git a/dom/events/EventStateManager.h b/dom/events/EventStateManager.h index e76047169c8..58ebde74421 100644 --- a/dom/events/EventStateManager.h +++ b/dom/events/EventStateManager.h @@ -530,10 +530,9 @@ class EventStateManager : public nsSupportsWeakReference, public nsIObserver { return mGestureDownContent; } - // If the current frame is for the current gesture down content (being - // dragged), when it's destroyed, we should continue the gesture on its - // parent. - void NotifyDestroyingFrameForGesture(nsIFrame* aFrame); + // Update the tracked gesture content to the parent of its frame when it's + // removed, so that the gesture can be continued. + void NotifyContentWillBeRemovedForGesture(nsIContent& aContent); bool IsTrackingDragGesture() const { return mGestureDownContent != nullptr; } diff --git a/dom/media/gtest/TestMediaDataEncoder.cpp b/dom/media/gtest/TestMediaDataEncoder.cpp index b212b9c1c4d..622e407a426 100644 --- a/dom/media/gtest/TestMediaDataEncoder.cpp +++ b/dom/media/gtest/TestMediaDataEncoder.cpp @@ -688,7 +688,7 @@ TEST_F(MediaDataEncoderTest, AndroidNotSupportedSize) { } #endif -#if defined(XP_LINUX) && !defined(ANDROID) +#if !defined(ANDROID) TEST_F(MediaDataEncoderTest, H264AVCC) { RUN_IF_SUPPORTED(CodecType::H264, [this]() { // Encod frames in avcC format. @@ -703,14 +703,18 @@ TEST_F(MediaDataEncoderTest, H264AVCC) { for (auto frame : output) { EXPECT_FALSE(AnnexB::IsAnnexB(frame)); if (frame->mKeyframe) { - AnnexB::IsAVCC(frame); - AVCCConfig config = AVCCConfig::Parse(frame).unwrap(); - EXPECT_EQ(config.mAVCProfileIndication, - static_cast( - kH264SpecificAVCC.mProfile)); - EXPECT_EQ(config.mAVCLevelIndication, - static_cast( - kH264SpecificAVCC.mLevel)); + // The extradata may be included at the beginning, whenever it changes, + // or with every keyframe to support robust seeking or decoder resets. + if (frame->mExtraData && !frame->mExtraData->IsEmpty()) { + EXPECT_TRUE(AnnexB::IsAVCC(frame)); + AVCCConfig config = AVCCConfig::Parse(frame).unwrap(); + EXPECT_EQ(config.mAVCProfileIndication, + static_cast( + kH264SpecificAVCC.mProfile)); + EXPECT_EQ(config.mAVCLevelIndication, + static_cast( + kH264SpecificAVCC.mLevel)); + } } } WaitForShutdown(e); @@ -813,7 +817,7 @@ TEST_F(MediaDataEncoderTest, VP8Duration) { }); } -#if defined(XP_LINUX) && !defined(ANDROID) +#if !defined(ANDROID) TEST_F(MediaDataEncoderTest, VP8EncodeAfterDrain) { RUN_IF_SUPPORTED(CodecType::VP8, [this]() { RefPtr e = CreateVP8Encoder(); @@ -986,7 +990,7 @@ TEST_F(MediaDataEncoderTest, VP9Duration) { }); } -#if defined(XP_LINUX) && !defined(ANDROID) +#if !defined(ANDROID) TEST_F(MediaDataEncoderTest, VP9EncodeAfterDrain) { RUN_IF_SUPPORTED(CodecType::VP9, [this]() { RefPtr e = CreateVP9Encoder(); diff --git a/dom/media/ipc/MFCDMParent.cpp b/dom/media/ipc/MFCDMParent.cpp index 8a4d3349074..d11481e1554 100644 --- a/dom/media/ipc/MFCDMParent.cpp +++ b/dom/media/ipc/MFCDMParent.cpp @@ -7,6 +7,7 @@ #include #include #include +#include "mozilla/Likely.h" #define INITGUID // Enable DEFINE_PROPERTYKEY() #include // For DEFINE_PROPERTYKEY() definition #include // For InitPropVariantFrom*() @@ -16,6 +17,7 @@ #include "RemoteDecodeUtils.h" // For GetCurrentSandboxingKind() #include "SpecialSystemDirectory.h" // For temp dir #include "WMFUtils.h" +#include "mozilla/DataMutex.h" #include "mozilla/EMEUtils.h" #include "mozilla/ProfilerMarkers.h" #include "mozilla/KeySystemConfig.h" @@ -90,13 +92,13 @@ DEFINE_PROPERTYKEY(EME_CONTENTDECRYPTIONMODULE_ORIGIN_ID, 0x1218a3e2, 0xcfb0, } \ } while (false) -StaticMutex sFactoryMutex; -MOZ_RUNINIT static nsTHashMap> - sFactoryMap; -MOZ_RUNINIT static CopyableTArray sCapabilities; -StaticMutex sCapabilitesMutex; -MOZ_RUNINIT static ComPtr sMediaEngineClassFactory; +MOZ_RUNINIT static StaticDataMutex< + nsTHashMap>> + sFactoryMap("sFactoryMap"); +MOZ_RUNINIT static StaticDataMutex> + sCapabilities("sCapabilities"); +MOZ_RUNINIT static StaticDataMutex> sMediaEngineClassFactory( + "sMediaEngineClassFactory"); // RAIIized PROPVARIANT. See // third_party/libwebrtc/modules/audio_device/win/core_audio_utility_win.h @@ -486,24 +488,32 @@ LPCWSTR MFCDMParent::GetCDMLibraryName(const nsString& aKeySystem) { /* static */ void MFCDMParent::Shutdown() { - StaticMutexAutoLock lock(sCapabilitesMutex); - sFactoryMap.Clear(); - sCapabilities.Clear(); - sMediaEngineClassFactory.Reset(); + { + auto factoryMap = sFactoryMap.Lock(); + factoryMap->Clear(); + } + { + auto capabilities = sCapabilities.Lock(); + capabilities->Clear(); + } + { + auto mediaEngineClassFactory = sMediaEngineClassFactory.Lock(); + mediaEngineClassFactory->Reset(); + } } /* static */ HRESULT MFCDMParent::GetOrCreateFactory( const nsString& aKeySystem, ComPtr& aFactoryOut) { - StaticMutexAutoLock lock(sFactoryMutex); - auto rv = sFactoryMap.MaybeGet(aKeySystem); + auto factoryMap = sFactoryMap.Lock(); + auto rv = factoryMap->MaybeGet(aKeySystem); if (!rv) { MFCDM_PARENT_SLOG("No factory %s, creating...", NS_ConvertUTF16toUTF8(aKeySystem).get()); ComPtr factory; MFCDM_RETURN_IF_FAILED(LoadFactory(aKeySystem, factory)); - sFactoryMap.InsertOrUpdate(aKeySystem, factory); + factoryMap->InsertOrUpdate(aKeySystem, factory); aFactoryOut.Swap(factory); } else { aFactoryOut = *rv; @@ -524,15 +534,29 @@ HRESULT MFCDMParent::LoadFactory( NS_ConvertUTF16toUTF8(aKeySystem).get()); ComPtr cdmFactory; if (loadFromPlatform) { - if (!sMediaEngineClassFactory) { - MFCDM_RETURN_IF_FAILED(CoCreateInstance( - CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&sMediaEngineClassFactory))); - } ComPtr clsFactory; - MFCDM_RETURN_IF_FAILED(sMediaEngineClassFactory.As(&clsFactory)); + { + auto mediaEngineClassFactory = sMediaEngineClassFactory.Lock(); + if (!*mediaEngineClassFactory) { + MFCDM_RETURN_IF_FAILED(CoCreateInstance( + CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&*mediaEngineClassFactory))); + } + MFCDM_RETURN_IF_FAILED((*mediaEngineClassFactory).As(&clsFactory)); + } MFCDM_RETURN_IF_FAILED(clsFactory->CreateContentDecryptionModuleFactory( MapKeySystem(aKeySystem).get(), IID_PPV_ARGS(&cdmFactory))); + if (MOZ_UNLIKELY(!cdmFactory)) { + if (IsBeingProfiledOrLogEnabled()) { + nsPrintfCString msg( + "CreateContentDecryptionModuleFactory succeeded, but still no " + "factory?!"); + MFCDM_PARENT_SLOG("%s", msg.get()); + PROFILER_MARKER_TEXT("MFCDMParent::LoadFactoryFailed", MEDIA_PLAYBACK, + {}, msg); + } + return E_UNEXPECTED; + } aFactoryOut.Swap(cdmFactory); MFCDM_PARENT_SLOG("Created factory for %s from platform!", NS_ConvertUTF16toUTF8(aKeySystem).get()); @@ -645,7 +669,11 @@ static bool FactorySupports(ComPtr& aFactory, if (IsPlayReadyKeySystemAndSupported(aKeySystem) && StaticPrefs::media_eme_playready_istypesupportedex()) { ComPtr spDrmTypeSupport; - MFCDM_RETURN_BOOL_IF_FAILED(sMediaEngineClassFactory.As(&spDrmTypeSupport)); + { + auto mediaEngineClassFactory = sMediaEngineClassFactory.Lock(); + MFCDM_RETURN_BOOL_IF_FAILED( + (*mediaEngineClassFactory).As(&spDrmTypeSupport)); + } BSTR keySystem = aIsHWSecure ? CreateBSTRFromConstChar(kPlayReadyKeySystemHardware) : CreateBSTRFromConstChar(kPlayReadyKeySystemName); @@ -841,8 +869,8 @@ void MFCDMParent::GetCapabilities(const nsString& aKeySystem, RETURN_VOID_IF_FAILED(GetOrCreateFactory(aKeySystem, factory)); } - StaticMutexAutoLock lock(sCapabilitesMutex); - for (auto& capabilities : sCapabilities) { + auto capabilitiesUnlocked = sCapabilities.Lock(); + for (auto& capabilities : *capabilitiesUnlocked) { if (capabilities.keySystem().Equals(aKeySystem) && capabilities.isHardwareDecryption() == isHardwareDecryption) { MFCDM_PARENT_SLOG( @@ -1060,7 +1088,7 @@ void MFCDMParent::GetCapabilities(const nsString& aKeySystem, KeySystemConfig::SessionType::PersistentLicense); // Cache capabilities for reuse. - sCapabilities.AppendElement(aCapabilitiesOut); + capabilitiesUnlocked->AppendElement(aCapabilitiesOut); } mozilla::ipc::IPCResult MFCDMParent::RecvGetCapabilities( diff --git a/dom/media/mediacontrol/tests/browser/browser.toml b/dom/media/mediacontrol/tests/browser/browser.toml index e9893269db1..e333f2c3e1e 100644 --- a/dom/media/mediacontrol/tests/browser/browser.toml +++ b/dom/media/mediacontrol/tests/browser/browser.toml @@ -55,9 +55,13 @@ skip-if = ["os == 'mac' && os_version == '10.15' && processor == 'x86_64' && ver skip-if = [ "os == 'linux' && os_version == '22.04' && processor == 'x86_64'", # Bug 1673527 "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1775892 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775892 ] ["browser_media_control_seek.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1961556 +] ["browser_media_control_stop_timer.js"] diff --git a/dom/media/platforms/apple/AppleUtils.cpp b/dom/media/platforms/apple/AppleUtils.cpp new file mode 100644 index 00000000000..2e043cd35d0 --- /dev/null +++ b/dom/media/platforms/apple/AppleUtils.cpp @@ -0,0 +1,80 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "apple/AppleUtils.h" + +#include + +namespace mozilla { + +SessionPropertyManager::SessionPropertyManager( + const AutoCFTypeRef& aSession) + : mSession(aSession) { + MOZ_ASSERT(mSession, "Session must be valid"); +} + +SessionPropertyManager::SessionPropertyManager( + const VTCompressionSessionRef& aSession) + : mSession(aSession, AutoTypePolicy::Retain) { + MOZ_ASSERT(mSession, "Session must be valid"); +} + +bool SessionPropertyManager::IsSupported(CFStringRef aKey) { + MOZ_ASSERT(mSession); + if (!mSupportedKeys) { + CFDictionaryRef dict; + if (VTSessionCopySupportedPropertyDictionary(mSession.Ref(), &dict) == + noErr) { + mSupportedKeys.Reset(dict, AutoTypePolicy::NoRetain); + } + } + return mSupportedKeys && CFDictionaryContainsKey(mSupportedKeys.Ref(), aKey); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, int32_t aValue) { + return Set(aKey, aValue, kCFNumberSInt32Type); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, int64_t aValue) { + return Set(aKey, aValue, kCFNumberSInt64Type); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, float aValue) { + return Set(aKey, aValue, kCFNumberFloatType); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, bool aValue) { + MOZ_ASSERT(mSession); + CFBooleanRef value = aValue ? kCFBooleanTrue : kCFBooleanFalse; + return VTSessionSetProperty(mSession.Ref(), aKey, value); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, CFStringRef value) { + MOZ_ASSERT(mSession); + return VTSessionSetProperty(mSession.Ref(), aKey, value); +} + +OSStatus SessionPropertyManager::Copy(CFStringRef aKey, bool& aValue) { + MOZ_ASSERT(mSession); + + AutoCFTypeRef value; + OSStatus rv = VTSessionCopyProperty(mSession.Ref(), aKey, kCFAllocatorDefault, + value.Receive()); + if (rv == noErr) { + aValue = value == kCFBooleanTrue; + } + return rv; +} + +template +OSStatus SessionPropertyManager::Set(CFStringRef aKey, V aValue, + CFNumberType aType) { + MOZ_ASSERT(mSession); + AutoCFTypeRef value( + CFNumberCreate(kCFAllocatorDefault, aType, &aValue), + AutoTypePolicy::NoRetain); + return VTSessionSetProperty(mSession.Ref(), aKey, value.Ref()); +} + +} // namespace mozilla diff --git a/dom/media/platforms/apple/AppleUtils.h b/dom/media/platforms/apple/AppleUtils.h index 1aee7be4cbf..8941c21b506 100644 --- a/dom/media/platforms/apple/AppleUtils.h +++ b/dom/media/platforms/apple/AppleUtils.h @@ -7,9 +7,11 @@ #ifndef mozilla_AppleUtils_h #define mozilla_AppleUtils_h +#include "mozilla/Assertions.h" #include "mozilla/Attributes.h" -#include // For CFRelease() -#include // For CVBufferRelease() +#include // For CFRelease() +#include // For CVBufferRelease() +#include // For VTCompressionSessionRef #if TARGET_OS_IPHONE inline bool OSSupportsSVC() { @@ -95,6 +97,139 @@ class CFRefPtr { T mRef; }; +template +struct AutoTypeRefTraits; + +enum class AutoTypePolicy { Retain, NoRetain }; +template > +class AutoTypeRef { + public: + explicit AutoTypeRef(T aObj = Traits::InvalidValue(), + AutoTypePolicy aPolicy = AutoTypePolicy::NoRetain) + : mObj(aObj) { + if (mObj != Traits::InvalidValue()) { + if (aPolicy == AutoTypePolicy::Retain) { + mObj = Traits::Retain(mObj); + } + } + } + + ~AutoTypeRef() { ReleaseIfNeeded(); } + + // Copy constructor + AutoTypeRef(const AutoTypeRef& aOther) : mObj(aOther.mObj) { + if (mObj != Traits::InvalidValue()) { + mObj = Traits::Retain(mObj); + } + } + + // Copy assignment + AutoTypeRef& operator=(const AutoTypeRef& aOther) { + ReleaseIfNeeded(); + mObj = aOther.mObj; + if (mObj != Traits::InvalidValue()) { + mObj = Traits::Retain(mObj); + } + return *this; + } + + // Move constructor + AutoTypeRef(AutoTypeRef&& aOther) : mObj(aOther.mObj) { + aOther.mObj = Traits::InvalidValue(); + } + + // Move assignment + AutoTypeRef& operator=(const AutoTypeRef&& aOther) { + ReleaseIfNeeded(); + mObj = aOther.mObj; + aOther.mObj = Traits::InvalidValue(); + return *this; + } + + explicit operator bool() const { return mObj != Traits::InvalidValue(); } + + operator T() { return mObj; } + + T& Ref() { return mObj; } + + T* Receive() { + MOZ_ASSERT(mObj == Traits::InvalidValue(), + "Receive() should only be called for uninitialized objects"); + return &mObj; + } + + void Reset(T aObj = Traits::InvalidValue(), + AutoTypePolicy aPolicy = AutoTypePolicy::NoRetain) { + ReleaseIfNeeded(); + mObj = aObj; + if (mObj != Traits::InvalidValue()) { + if (aPolicy == AutoTypePolicy::Retain) { + mObj = Traits::Retain(mObj); + } else { + mObj = aObj; + } + } + } + + private: + void ReleaseIfNeeded() { + if (mObj != Traits::InvalidValue()) { + Traits::Release(mObj); + mObj = Traits::InvalidValue(); + } + } + T mObj; +}; + +template +struct CFTypeRefTraits { + static CFT InvalidValue() { return nullptr; } + static CFT Retain(CFT aObject) { + CFRetain(aObject); + return aObject; + } + static void Release(CFT aObject) { CFRelease(aObject); } +}; + +template +struct CVBufferRefTraits { + static CVB InvalidValue() { return nullptr; } + static CVB Retain(CVB aObject) { + CVBufferRetain(aObject); + return aObject; + } + static void Release(CVB aObject) { CVBufferRelease(aObject); } +}; + +template +using AutoCFTypeRef = AutoTypeRef>; +template +using AutoCVBufferRef = AutoTypeRef>; + +class MOZ_RAII SessionPropertyManager { + public: + explicit SessionPropertyManager( + const AutoCFTypeRef& aSession); + explicit SessionPropertyManager(const VTCompressionSessionRef& aSession); + ~SessionPropertyManager() = default; + + bool IsSupported(CFStringRef aKey); + + OSStatus Set(CFStringRef aKey, int32_t aValue); + OSStatus Set(CFStringRef aKey, int64_t aValue); + OSStatus Set(CFStringRef aKey, float aValue); + OSStatus Set(CFStringRef aKey, bool aValue); + OSStatus Set(CFStringRef aKey, CFStringRef value); + OSStatus Copy(CFStringRef aKey, bool& aValue); + + private: + template + OSStatus Set(CFStringRef aKey, V aValue, CFNumberType aType); + + AutoCFTypeRef mSession; + AutoCFTypeRef mSupportedKeys; +}; + } // namespace mozilla #endif // mozilla_AppleUtils_h diff --git a/dom/media/platforms/apple/AppleVTDecoder.cpp b/dom/media/platforms/apple/AppleVTDecoder.cpp index a5d81a2e92d..8ef21c1a27e 100644 --- a/dom/media/platforms/apple/AppleVTDecoder.cpp +++ b/dom/media/platforms/apple/AppleVTDecoder.cpp @@ -12,7 +12,6 @@ #include "AOMDecoder.h" #include "AppleDecoderModule.h" -#include "AppleUtils.h" #include "CallbackThreadRegistry.h" #include "H264.h" #include "H265.h" @@ -187,8 +186,8 @@ void AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { "AppleVTDecoder"_ns, aId, flag); }); - AutoCFRelease block = nullptr; - AutoCFRelease sample = nullptr; + AutoCFTypeRef block; + AutoCFTypeRef sample; VTDecodeInfoFlags infoFlags; OSStatus rv; @@ -202,7 +201,7 @@ void AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { kCFAllocatorNull, // Block allocator. NULL, // Block source. 0, // Data offset. - aSample->Size(), false, block.receive()); + aSample->Size(), false, block.Receive()); if (rv != noErr) { NS_ERROR("Couldn't create CMBlockBuffer"); MonitorAutoLock mon(mMonitor); @@ -215,7 +214,7 @@ void AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { CMSampleTimingInfo timestamp = TimingInfoFromSample(aSample); rv = CMSampleBufferCreate(kCFAllocatorDefault, block, true, 0, 0, mFormat, 1, - 1, ×tamp, 0, NULL, sample.receive()); + 1, ×tamp, 0, NULL, sample.Receive()); if (rv != noErr) { NS_ERROR("Couldn't create CMSampleBuffer"); MonitorAutoLock mon(mMonitor); @@ -253,15 +252,13 @@ void AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { void AppleVTDecoder::ProcessShutdown() { if (mSession) { - LOG("%s: cleaning up session %p", __func__, mSession); + LOG("%s: cleaning up session", __func__); VTDecompressionSessionInvalidate(mSession); - CFRelease(mSession); - mSession = nullptr; + mSession.Reset(); } if (mFormat) { - LOG("%s: releasing format %p", __func__, mFormat); - CFRelease(mFormat); - mFormat = nullptr; + LOG("%s: releasing format", __func__); + mFormat.Reset(); } } @@ -595,7 +592,7 @@ nsresult AppleVTDecoder::WaitForAsynchronousFrames() { MediaResult AppleVTDecoder::InitializeSession() { OSStatus rv; - AutoCFRelease extensions = CreateDecoderExtensions(); + AutoCFTypeRef extensions(CreateDecoderExtensions()); CMVideoCodecType streamType; if (mStreamType == StreamType::H264) { streamType = kCMVideoCodecType_H264; @@ -609,25 +606,25 @@ MediaResult AppleVTDecoder::InitializeSession() { rv = CMVideoFormatDescriptionCreate( kCFAllocatorDefault, streamType, AssertedCast(mPictureWidth), - AssertedCast(mPictureHeight), extensions, &mFormat); + AssertedCast(mPictureHeight), extensions, mFormat.Receive()); if (rv != noErr) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, RESULT_DETAIL("Couldn't create format description!")); } // Contruct video decoder selection spec. - AutoCFRelease spec = CreateDecoderSpecification(); + AutoCFTypeRef spec(CreateDecoderSpecification()); // Contruct output configuration. - AutoCFRelease outputConfiguration = - CreateOutputConfiguration(); + AutoCFTypeRef outputConfiguration( + CreateOutputConfiguration()); VTDecompressionOutputCallbackRecord cb = {PlatformCallback, this}; rv = VTDecompressionSessionCreate(kCFAllocatorDefault, mFormat, spec, // Video decoder selection. outputConfiguration, // Output video format. - &cb, &mSession); + &cb, mSession.Receive()); if (rv != noErr) { LOG("AppleVTDecoder: VTDecompressionSessionCreate failed: %d", rv); @@ -657,9 +654,9 @@ MediaResult AppleVTDecoder::InitializeSession() { } CFDictionaryRef AppleVTDecoder::CreateDecoderExtensions() { - AutoCFRelease data = + AutoCFTypeRef data( CFDataCreate(kCFAllocatorDefault, mExtraData->Elements(), - AssertedCast(mExtraData->Length())); + AssertedCast(mExtraData->Length()))); const void* atomsKey[1]; if (mStreamType == StreamType::H264) { @@ -676,9 +673,9 @@ CFDictionaryRef AppleVTDecoder::CreateDecoderExtensions() { static_assert(std::size(atomsKey) == std::size(atomsValue), "Non matching keys/values array size"); - AutoCFRelease atoms = CFDictionaryCreate( + AutoCFTypeRef atoms(CFDictionaryCreate( kCFAllocatorDefault, atomsKey, atomsValue, std::size(atomsKey), - &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); const void* extensionKeys[] = { kCVImageBufferChromaLocationBottomFieldKey, @@ -718,8 +715,8 @@ CFDictionaryRef AppleVTDecoder::CreateOutputConfiguration() { if (mUseSoftwareImages) { // Output format type: SInt32 PixelFormatTypeValue = kCVPixelFormatType_420YpCbCr8Planar; - AutoCFRelease PixelFormatTypeNumber = CFNumberCreate( - kCFAllocatorDefault, kCFNumberSInt32Type, &PixelFormatTypeValue); + AutoCFTypeRef PixelFormatTypeNumber(CFNumberCreate( + kCFAllocatorDefault, kCFNumberSInt32Type, &PixelFormatTypeValue)); const void* outputKeys[] = {kCVPixelBufferPixelFormatTypeKey}; const void* outputValues[] = {PixelFormatTypeNumber}; static_assert(std::size(outputKeys) == std::size(outputValues), @@ -739,8 +736,8 @@ CFDictionaryRef AppleVTDecoder::CreateOutputConfiguration() { : kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) : (is10Bit ? kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange : kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange); - AutoCFRelease PixelFormatTypeNumber = CFNumberCreate( - kCFAllocatorDefault, kCFNumberSInt32Type, &PixelFormatTypeValue); + AutoCFTypeRef PixelFormatTypeNumber(CFNumberCreate( + kCFAllocatorDefault, kCFNumberSInt32Type, &PixelFormatTypeValue)); // Construct IOSurface Properties const void* IOSurfaceKeys[] = {kIOSurfaceIsGlobal}; const void* IOSurfaceValues[] = {kCFBooleanTrue}; @@ -748,10 +745,10 @@ CFDictionaryRef AppleVTDecoder::CreateOutputConfiguration() { "Non matching keys/values array size"); // Contruct output configuration. - AutoCFRelease IOSurfaceProperties = CFDictionaryCreate( + AutoCFTypeRef IOSurfaceProperties(CFDictionaryCreate( kCFAllocatorDefault, IOSurfaceKeys, IOSurfaceValues, std::size(IOSurfaceKeys), &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); + &kCFTypeDictionaryValueCallBacks)); const void* outputKeys[] = {kCVPixelBufferIOSurfacePropertiesKey, kCVPixelBufferPixelFormatTypeKey, diff --git a/dom/media/platforms/apple/AppleVTDecoder.h b/dom/media/platforms/apple/AppleVTDecoder.h index c7e5a783f79..0d74fae6b6d 100644 --- a/dom/media/platforms/apple/AppleVTDecoder.h +++ b/dom/media/platforms/apple/AppleVTDecoder.h @@ -16,6 +16,7 @@ #include "PlatformDecoderModule.h" #include "ReorderQueue.h" #include "TimeUnits.h" +#include "apple/AppleUtils.h" #include "mozilla/Atomics.h" #include "mozilla/DefineEnum.h" #include "mozilla/ProfilerUtils.h" @@ -147,8 +148,8 @@ class AppleVTDecoder final : public MediaDataDecoder, // safe to access it in OutputFrame without protecting. Maybe mSeekTargetThreshold; - CMVideoFormatDescriptionRef mFormat; - VTDecompressionSessionRef mSession; + AutoCFTypeRef mFormat; + AutoCFTypeRef mSession; Atomic mIsHardwareAccelerated; PerformanceRecorderMulti mPerformanceRecorder; }; diff --git a/dom/media/platforms/apple/AppleVTEncoder.cpp b/dom/media/platforms/apple/AppleVTEncoder.cpp index 681e8f31aa0..372db4fd3c0 100644 --- a/dom/media/platforms/apple/AppleVTEncoder.cpp +++ b/dom/media/platforms/apple/AppleVTEncoder.cpp @@ -12,7 +12,6 @@ #include #include "AnnexB.h" -#include "AppleUtils.h" #include "H264.h" #include "ImageContainer.h" @@ -70,64 +69,59 @@ static void FrameCallback(void* aEncoder, void* aFrameRefCon, OSStatus aStatus, ->OutputFrame(aStatus, aInfoFlags, aSampleBuffer); } -static bool SetAverageBitrate(VTCompressionSessionRef& aSession, - uint32_t aBitsPerSec) { - int64_t bps(aBitsPerSec); - AutoCFRelease bitrate( - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &bps)); - return VTSessionSetProperty(aSession, - kVTCompressionPropertyKey_AverageBitRate, - bitrate) == noErr; +bool AppleVTEncoder::SetAverageBitrate(uint32_t aBitsPerSec) { + MOZ_ASSERT(mSession); + + SessionPropertyManager mgr(mSession); + return mgr.Set(kVTCompressionPropertyKey_AverageBitRate, + int64_t(aBitsPerSec)) == noErr; } -static bool SetConstantBitrate(VTCompressionSessionRef& aSession, - uint32_t aBitsPerSec) { - int32_t bps(aBitsPerSec); - AutoCFRelease bitrate( - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bps)); +bool AppleVTEncoder::SetConstantBitrate(uint32_t aBitsPerSec) { + MOZ_ASSERT(mSession); if (__builtin_available(macos 13.0, *)) { - int rv = VTSessionSetProperty(aSession, - kVTCompressionPropertyKey_ConstantBitRate, - bitrate) == noErr; + SessionPropertyManager mgr(mSession); + OSStatus rv = mgr.Set(kVTCompressionPropertyKey_ConstantBitRate, + AssertedCast(aBitsPerSec)); if (rv == kVTPropertyNotSupportedErr) { LOGE("Constant bitrate not supported."); } + return rv == noErr; } return false; } -static bool SetBitrateAndMode(VTCompressionSessionRef& aSession, - BitrateMode aBitrateMode, uint32_t aBitsPerSec) { +bool AppleVTEncoder::SetBitrateAndMode(BitrateMode aBitrateMode, + uint32_t aBitsPerSec) { if (aBitrateMode == BitrateMode::Variable) { - return SetAverageBitrate(aSession, aBitsPerSec); + return SetAverageBitrate(aBitsPerSec); } - return SetConstantBitrate(aSession, aBitsPerSec); + return SetConstantBitrate(aBitsPerSec); } -static bool SetFrameRate(VTCompressionSessionRef& aSession, int64_t aFPS) { - AutoCFRelease framerate( - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &aFPS)); - return VTSessionSetProperty(aSession, - kVTCompressionPropertyKey_ExpectedFrameRate, - framerate) == noErr; +bool AppleVTEncoder::SetFrameRate(int64_t aFPS) { + MOZ_ASSERT(mSession); + + SessionPropertyManager mgr(mSession); + return mgr.Set(kVTCompressionPropertyKey_ExpectedFrameRate, aFPS) == noErr; } -static bool SetRealtime(VTCompressionSessionRef& aSession, bool aEnabled) { +bool AppleVTEncoder::SetRealtime(bool aEnabled) { + MOZ_ASSERT(mSession); + // B-frames has been disabled in Init(), so no need to set it here. - CFBooleanRef enabled = aEnabled ? kCFBooleanTrue : kCFBooleanFalse; - OSStatus status = VTSessionSetProperty( - aSession, kVTCompressionPropertyKey_RealTime, enabled); + SessionPropertyManager mgr(mSession); + OSStatus status = mgr.Set(kVTCompressionPropertyKey_RealTime, aEnabled); LOGD("%s real time, status: %d", aEnabled ? "Enable" : "Disable", status); if (status != noErr) { return false; } if (__builtin_available(macos 11.0, *)) { - status = VTSessionSetProperty( - aSession, kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality, - enabled); + status = mgr.Set( + kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality, aEnabled); LOGD("%s PrioritizeEncodingSpeedOverQuality, status: %d", aEnabled ? "Enable" : "Disable", status); if (status != noErr && status != kVTPropertyNotSupportedErr) { @@ -136,10 +130,8 @@ static bool SetRealtime(VTCompressionSessionRef& aSession, bool aEnabled) { } int32_t maxFrameDelayCount = aEnabled ? 0 : kVTUnlimitedFrameDelayCount; - AutoCFRelease cf(CFNumberCreate( - kCFAllocatorDefault, kCFNumberSInt32Type, &maxFrameDelayCount)); - status = VTSessionSetProperty( - aSession, kVTCompressionPropertyKey_MaxFrameDelayCount, cf); + status = + mgr.Set(kVTCompressionPropertyKey_MaxFrameDelayCount, maxFrameDelayCount); LOGD("Set max frame delay count to %d, status: %d", maxFrameDelayCount, status); if (status != noErr && status != kVTPropertyNotSupportedErr) { @@ -149,8 +141,9 @@ static bool SetRealtime(VTCompressionSessionRef& aSession, bool aEnabled) { return true; } -static bool SetProfileLevel(VTCompressionSessionRef& aSession, - H264_PROFILE aValue) { +bool AppleVTEncoder::SetProfileLevel(H264_PROFILE aValue) { + MOZ_ASSERT(mSession); + CFStringRef profileLevel = nullptr; switch (aValue) { case H264_PROFILE::H264_PROFILE_BASE: @@ -166,10 +159,12 @@ static bool SetProfileLevel(VTCompressionSessionRef& aSession, LOGE("Profile %d not handled", static_cast(aValue)); } - return profileLevel ? VTSessionSetProperty( - aSession, kVTCompressionPropertyKey_ProfileLevel, - profileLevel) == noErr - : false; + if (profileLevel == nullptr) { + return false; + } + + SessionPropertyManager mgr(mSession); + return mgr.Set(kVTCompressionPropertyKey_ProfileLevel, profileLevel) == noErr; } static Result MapPixelFormat( @@ -256,7 +251,7 @@ MediaResult AppleVTEncoder::InitSession() { LOGD("low latency rate control: %s, Hardware allowed: %s", lowLatencyRateControl ? "yes" : "no", mHardwareNotAllowed ? "no" : "yes"); - AutoCFRelease spec( + AutoCFTypeRef spec( BuildEncoderSpec(mHardwareNotAllowed, lowLatencyRateControl)); // Bug 1955153: Set sourceImageBufferAttributes using the pixel format derived @@ -265,20 +260,20 @@ MediaResult AppleVTEncoder::InitSession() { kCFAllocatorDefault, mConfig.mSize.width, mConfig.mSize.height, kCMVideoCodecType_H264, spec, nullptr /* sourceImageBufferAttributes */, kCFAllocatorDefault, &FrameCallback, this /* outputCallbackRefCon */, - &mSession); + mSession.Receive()); if (status != noErr) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "fail to create encoder session"); } - if (VTSessionSetProperty(mSession, - kVTCompressionPropertyKey_AllowFrameReordering, - kCFBooleanFalse) != noErr) { + SessionPropertyManager mgr(mSession); + + if (mgr.Set(kVTCompressionPropertyKey_AllowFrameReordering, false) != noErr) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "Couldn't disable bframes"); } - if (mConfig.mUsage == Usage::Realtime && !SetRealtime(mSession, true)) { + if (mConfig.mUsage == Usage::Realtime && !SetRealtime(true)) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "fail to configure real-time"); } @@ -290,8 +285,7 @@ MediaResult AppleVTEncoder::InitSession() { LOGD("H264 CBR not supported in VideoToolbox, falling back to VBR"); mConfig.mBitrateMode = BitrateMode::Variable; } - bool rv = - SetBitrateAndMode(mSession, mConfig.mBitrateMode, mConfig.mBitrate); + bool rv = SetBitrateAndMode(mConfig.mBitrateMode, mConfig.mBitrate); if (!rv) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "fail to configurate bitrate"); @@ -314,11 +308,9 @@ MediaResult AppleVTEncoder::InitSession() { default: MOZ_ASSERT_UNREACHABLE("Unhandled value"); } - AutoCFRelease cf(CFNumberCreate( - kCFAllocatorDefault, kCFNumberFloatType, &baseLayerFPSRatio)); - if (VTSessionSetProperty( - mSession, kVTCompressionPropertyKey_BaseLayerFrameRateFraction, - cf)) { + + if (mgr.Set(kVTCompressionPropertyKey_BaseLayerFrameRateFraction, + baseLayerFPSRatio) != noErr) { return MediaResult( NS_ERROR_DOM_MEDIA_FATAL_ERR, nsPrintfCString("fail to configure SVC (base ratio: %f", @@ -334,11 +326,9 @@ MediaResult AppleVTEncoder::InitSession() { mConfig.mKeyframeInterval > std::numeric_limits::max() ? std::numeric_limits::max() : AssertedCast(mConfig.mKeyframeInterval); - AutoCFRelease cf( - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &interval)); - if (VTSessionSetProperty(mSession, - kVTCompressionPropertyKey_MaxKeyFrameInterval, - cf) != noErr) { + + if (mgr.Set(kVTCompressionPropertyKey_MaxKeyFrameInterval, interval) != + noErr) { return MediaResult( NS_ERROR_DOM_MEDIA_FATAL_ERR, nsPrintfCString("fail to configurate keyframe interval:%" PRId64, @@ -347,18 +337,18 @@ MediaResult AppleVTEncoder::InitSession() { if (mConfig.mCodecSpecific) { const H264Specific& specific = mConfig.mCodecSpecific->as(); - if (!SetProfileLevel(mSession, specific.mProfile)) { + if (!SetProfileLevel(specific.mProfile)) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, nsPrintfCString("fail to configurate profile level:%d", int(specific.mProfile))); } } - AutoCFRelease isUsingHW = nullptr; - status = VTSessionCopyProperty( - mSession, kVTCompressionPropertyKey_UsingHardwareAcceleratedVideoEncoder, - kCFAllocatorDefault, isUsingHW.receive()); - mIsHardwareAccelerated = status == noErr && isUsingHW == kCFBooleanTrue; + bool isUsingHW = false; + status = + mgr.Copy(kVTCompressionPropertyKey_UsingHardwareAcceleratedVideoEncoder, + isUsingHW); + mIsHardwareAccelerated = status == noErr && isUsingHW; LOGD("Using hw acceleration: %s", mIsHardwareAccelerated ? "yes" : "no"); errorExit.release(); @@ -368,8 +358,7 @@ MediaResult AppleVTEncoder::InitSession() { void AppleVTEncoder::InvalidateSessionIfNeeded() { if (mSession) { VTCompressionSessionInvalidate(mSession); - CFRelease(mSession); - mSession = nullptr; + mSession.Reset(); } } @@ -380,10 +369,10 @@ CFDictionaryRef AppleVTEncoder::BuildSourceImageBufferAttributes( kCVPixelBufferIOSurfacePropertiesKey, // TODO kCVPixelBufferPixelFormatTypeKey}; - AutoCFRelease ioSurfaceProps(CFDictionaryCreate( + AutoCFTypeRef ioSurfaceProps(CFDictionaryCreate( kCFAllocatorDefault, nullptr, nullptr, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); - AutoCFRelease pixelFormat( + AutoCFTypeRef pixelFormat( CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &aPixelFormat)); const void* values[] = {kCFBooleanTrue, ioSurfaceProps, pixelFormat}; @@ -490,6 +479,8 @@ bool AppleVTEncoder::WriteExtraData(MediaRawData* aDst, CMSampleBufferRef aSrc, return true; } + LOGV("Writing extra data (%s) for keyframe", aAsAnnexB ? "AnnexB" : "AVCC"); + aDst->mKeyframe = true; CMFormatDescriptionRef desc = CMSampleBufferGetFormatDescription(aSrc); if (!desc) { @@ -503,15 +494,17 @@ bool AppleVTEncoder::WriteExtraData(MediaRawData* aDst, CMSampleBufferRef aSrc, RefPtr avcc = extractAvcc(desc); if (!avcc) { + LOGE("failed to extract avcc"); return false; } if (!mAvcc || !H264::CompareExtraData(avcc, mAvcc)) { + LOGV("avcC changed, updating"); mAvcc = avcc; aDst->mExtraData = mAvcc; } - return avcc != nullptr; + return true; } static bool WriteNALUs(MediaRawData* aDst, CMSampleBufferRef aSrc, @@ -705,7 +698,7 @@ void AppleVTEncoder::ProcessEncode(const RefPtr& aSample) { MaybeResolveOrRejectEncodePromise(); } - AutoCVBufferRelease buffer( + AutoCVBufferRef buffer( CreateCVPixelBuffer(aSample->mImage)); if (!buffer) { LOGE("Failed to allocate buffer"); @@ -770,15 +763,13 @@ AppleVTEncoder::ProcessReconfigure( [&](const DisplayDimensionsChange& aChange) -> bool { return false; }, [&](const BitrateModeChange& aChange) -> bool { mConfig.mBitrateMode = aChange.get(); - return SetBitrateAndMode(mSession, mConfig.mBitrateMode, - mConfig.mBitrate); + return SetBitrateAndMode(mConfig.mBitrateMode, mConfig.mBitrate); }, [&](const BitrateChange& aChange) -> bool { mConfig.mBitrate = aChange.get().refOr(0); // 0 is the default in AppleVTEncoder: the encoder chooses the bitrate // based on the content. - return SetBitrateAndMode(mSession, mConfig.mBitrateMode, - mConfig.mBitrate); + return SetBitrateAndMode(mConfig.mBitrateMode, mConfig.mBitrate); }, [&](const FramerateChange& aChange) -> bool { // 0 means default, in VideoToolbox, and is valid, perform some light @@ -789,11 +780,11 @@ AppleVTEncoder::ProcessReconfigure( LOGE("Invalid fps of %lf", fps); return false; } - return SetFrameRate(mSession, AssertedCast(fps)); + return SetFrameRate(AssertedCast(fps)); }, [&](const UsageChange& aChange) -> bool { mConfig.mUsage = aChange.get(); - return SetRealtime(mSession, aChange.get() == Usage::Realtime); + return SetRealtime(aChange.get() == Usage::Realtime); }, [&](const ContentHintChange& aChange) -> bool { return false; }, [&](const SampleRateChange& aChange) -> bool { return false; }, @@ -1019,8 +1010,7 @@ RefPtr AppleVTEncoder::SetBitrate(uint32_t aBitsPerSec) { RefPtr self = this; return InvokeAsync(mTaskQueue, __func__, [self, aBitsPerSec]() { MOZ_ASSERT(self->mSession); - bool rv = SetBitrateAndMode(self->mSession, self->mConfig.mBitrateMode, - aBitsPerSec); + bool rv = self->SetBitrateAndMode(self->mConfig.mBitrateMode, aBitsPerSec); return rv ? GenericPromise::CreateAndResolve(true, __func__) : GenericPromise::CreateAndReject( NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR, __func__); diff --git a/dom/media/platforms/apple/AppleVTEncoder.h b/dom/media/platforms/apple/AppleVTEncoder.h index 146e7554961..db9208b9a76 100644 --- a/dom/media/platforms/apple/AppleVTEncoder.h +++ b/dom/media/platforms/apple/AppleVTEncoder.h @@ -10,6 +10,7 @@ #include #include +#include "apple/AppleUtils.h" #include "PlatformEncoderModule.h" namespace mozilla { @@ -73,6 +74,14 @@ class AppleVTEncoder final : public MediaDataEncoder { CVPixelBufferRef CreateCVPixelBuffer(layers::Image* aSource); bool WriteExtraData(MediaRawData* aDst, CMSampleBufferRef aSrc, const bool aAsAnnexB); + + bool SetAverageBitrate(uint32_t aBitsPerSec); + bool SetConstantBitrate(uint32_t aBitsPerSec); + bool SetBitrateAndMode(BitrateMode aBitrateMode, uint32_t aBitsPerSec); + bool SetFrameRate(int64_t aFPS); + bool SetRealtime(bool aEnabled); + bool SetProfileLevel(H264_PROFILE aValue); + void AssertOnTaskQueue() { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); } EncoderConfig mConfig; @@ -86,7 +95,7 @@ class AppleVTEncoder final : public MediaDataEncoder { MediaResult mError; // Written by Init() but used only in task queue. - VTCompressionSessionRef mSession; + AutoCFTypeRef mSession; // Can be accessed on any thread, but only written on during init. Atomic mIsHardwareAccelerated; // Accessed only in mTaskQueue. Used for for OS versions < 11. diff --git a/dom/media/platforms/moz.build b/dom/media/platforms/moz.build index a277b5b02db..237cbc9f044 100644 --- a/dom/media/platforms/moz.build +++ b/dom/media/platforms/moz.build @@ -89,11 +89,13 @@ if CONFIG["MOZ_APPLEMEDIA"]: EXPORTS += [ "apple/AppleDecoderModule.h", "apple/AppleEncoderModule.h", + "apple/AppleUtils.h", ] UNIFIED_SOURCES += [ "apple/AppleATDecoder.cpp", "apple/AppleDecoderModule.cpp", "apple/AppleEncoderModule.cpp", + "apple/AppleUtils.cpp", "apple/AppleVTDecoder.cpp", "apple/AppleVTEncoder.cpp", ] diff --git a/dom/media/platforms/wmf/WMFEncoderModule.cpp b/dom/media/platforms/wmf/WMFEncoderModule.cpp index 7b5af9bf50f..d459f0e3d36 100644 --- a/dom/media/platforms/wmf/WMFEncoderModule.cpp +++ b/dom/media/platforms/wmf/WMFEncoderModule.cpp @@ -26,6 +26,9 @@ bool WMFEncoderModule::Supports(const EncoderConfig& aConfig) const { if (aConfig.IsAudio()) { return false; } + if (aConfig.mScalabilityMode != ScalabilityMode::None) { + return aConfig.mCodec == CodecType::H264; + } return SupportsCodec(aConfig.mCodec); } diff --git a/dom/media/platforms/wmf/WMFMediaDataEncoder.cpp b/dom/media/platforms/wmf/WMFMediaDataEncoder.cpp index 9dd95b204b9..d5dc3b07b5d 100644 --- a/dom/media/platforms/wmf/WMFMediaDataEncoder.cpp +++ b/dom/media/platforms/wmf/WMFMediaDataEncoder.cpp @@ -343,7 +343,8 @@ already_AddRefed WMFMediaDataEncoder::IMFSampleToMediaData( auto frame = MakeRefPtr(); - if (mConfig.mScalabilityMode != ScalabilityMode::None) { + if (mConfig.mCodec == CodecType::H264 && + mConfig.mScalabilityMode != ScalabilityMode::None) { auto maybeId = H264::ExtractSVCTemporalId(lockBuffer.Data(), lockBuffer.Length()); frame->mTemporalLayerId = Some(maybeId.unwrapOr(0)); diff --git a/dom/media/test/mochitest.toml b/dom/media/test/mochitest.toml index c968f09e990..35e758ababb 100644 --- a/dom/media/test/mochitest.toml +++ b/dom/media/test/mochitest.toml @@ -815,6 +815,7 @@ scheme = "https" ["test_mediatrack_consuming_mediastream.html"] scheme = "https" tags = "mtg" +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # TIMEOUT ["test_mediatrack_replay_from_end.html"] @@ -831,6 +832,7 @@ skip-if = [ ["test_mp4a_32bit_samplesize.html"] # bug 1924052 ["test_multiple_mediastreamtracks.html"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # TIMEOUT scheme = "https" ["test_play_events_2.html"] @@ -897,6 +899,7 @@ skip-if = ["os == 'android'"] # Android has black frames issue. ["test_setSinkId_after_loop.html"] scheme = "https" +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # Bug 1961557 ["test_temporary_file_blob_video_plays.html"] skip-if = ["os == 'android'"] # bug 1533534 # android(bug 1232305) diff --git a/dom/media/test/mochitest_compat.toml b/dom/media/test/mochitest_compat.toml index f0cb9986d54..7f34caafb9f 100644 --- a/dom/media/test/mochitest_compat.toml +++ b/dom/media/test/mochitest_compat.toml @@ -863,6 +863,7 @@ skip-if = ["wmfme"] # Bug 1781539 ["test_mediatrack_events.html"] scheme = "https" +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # TIMEOUT ["test_mediatrack_parsing_ogg.html"] diff --git a/dom/media/test/reftest/color_quads/reftest.list b/dom/media/test/reftest/color_quads/reftest.list index 6e58cdcfc40..27f618e105a 100644 --- a/dom/media/test/reftest/color_quads/reftest.list +++ b/dom/media/test/reftest/color_quads/reftest.list @@ -14,17 +14,17 @@ defaults pref(media.av1.enabled,true) # - # yuv420p -fuzzy(16-51,5234-5622) fuzzy-if(swgl,32-38,1600-91746) fuzzy-if(useDrawSnapshot,16-16,11600-11600) fuzzy-if(cocoaWidget,16-73,5212-5622) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm ../reftest_img.html?src=color_quads/720p.png -fuzzy-if(Android,25-255,273680-359920) fuzzy-if(cocoaWidget,0-35,0-1947) fuzzy-if(cocoaWidget&&swgl,0-67,0-196692) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,12-12,187326-196692) fuzzy-if(appleSilicon,30-48,1760-187409) fuzzy-if(winWidget&&swgl,0-20,0-5620) fuzzy-if(winWidget&&!swgl,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 +fuzzy(16-51,5234-5622) fuzzy-if(swgl,32-38,1600-91746) fuzzy-if(useDrawSnapshot,16-16,11600-11600) fuzzy-if(cocoaWidget,16-73,5212-5622) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),65-68,187405-196775) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm ../reftest_img.html?src=color_quads/720p.png +fuzzy-if(Android,25-255,273680-359920) fuzzy-if(cocoaWidget,0-35,0-1947) fuzzy-if(cocoaWidget&&swgl,0-67,0-196692) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,12-12,187326-196692) fuzzy-if(cocoaWidget&&/^14\.20$/.test(os_version),30-48,1760-187409) fuzzy-if(winWidget&&swgl,0-20,0-5620) fuzzy-if(winWidget&&!swgl,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 fuzzy-if(winWidget,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm -skip-if(winWidget&&isCoverageBuild) fuzzy(0-16,75-1941) fuzzy-if(Android,28-255,273680-359920) fuzzy-if(cocoaWidget,30-32,187326-187407) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-13,0-196692) fuzzy-if(appleSilicon,30-48,1835-187409) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 -skip-if(Android) fuzzy-if(cocoaWidget,0-35,0-1947) fuzzy-if(cocoaWidget&&swgl,0-67,0-196692) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,12-12,187326-196692) fuzzy-if(appleSilicon,30-48,1760-187409) fuzzy-if(winWidget&&swgl,0-20,0-5620) fuzzy-if(winWidget&&!swgl,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 +skip-if(winWidget&&isCoverageBuild) fuzzy(0-16,75-1941) fuzzy-if(Android,28-255,273680-359920) fuzzy-if(cocoaWidget,30-32,187326-187407) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-13,0-196692) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),0-2,0-159) fuzzy-if(cocoaWidget&&/^11\.20$/.test(os_version),30-48,1835-187409) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 +skip-if(Android) fuzzy-if(cocoaWidget,0-35,0-1947) fuzzy-if(cocoaWidget&&swgl,0-67,0-196692) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,12-12,187326-196692) fuzzy-if(cocoaWidget&&/^11\.20$/.test(os_version),30-48,1760-187409) fuzzy-if(winWidget&&swgl,0-20,0-5620) fuzzy-if(winWidget&&!swgl,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 -skip-if(Android) fuzzy(16-48,8107-8818) fuzzy-if(winWidget&&swgl,31-38,8240-184080) fuzzy-if(appleSilicon,33-38,8819-11705) fuzzy-if(useDrawSnapshot,20-20,187200-187200) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm ../reftest_img.html?src=color_quads/720p.png +skip-if(Android) fuzzy(16-48,8107-8818) fuzzy-if(useDrawSnapshot,20-20,187200-187200) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),65-68,187405-196775) fuzzy-if(cocoaWidget&&/^11\.20$/.test(os_version),33-38,8819-11705) fuzzy-if(winWidget&&swgl,31-38,8240-184080) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm ../reftest_img.html?src=color_quads/720p.png skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # On Windows & sw render, we noticed that the comparison image captured from AV1 is not equal to its displayed video frame, so we would need to compare other codecs directly to PNG file. That should be fixed in bug 1748540. skip-if(Android) skip-if(winWidget&&swgl) fuzzy-if(Android,255-255,273726-273726) fuzzy-if(cocoaWidget,0-16,0-1718) fuzzy-if(cocoaWidget&&swgl,0-42,0-196694) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,40-42,187328-196694) fuzzy-if(appleSilicon,0-16,0-1874) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # Bug 1934894 -skip-if(Android) skip-if(winWidget&&swgl) fuzzy-if(useDrawSnapshot,0-1,0-10) fuzzy-if(Android,255-255,273726-273726) fuzzy-if(cocoaWidget,2-36,184281-187407) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),39-40,187329-196695) fuzzy-if(appleSilicon,36-49,187329-187407) fuzzy-if(winWidget,0-21,0-360000) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # Bug 1934894 +skip-if(Android) skip-if(winWidget&&swgl) fuzzy-if(useDrawSnapshot,0-1,0-10) fuzzy-if(Android,255-255,273726-273726) fuzzy-if(cocoaWidget,2-36,184281-187407) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),39-40,187329-196695) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),0-1,0-6) fuzzy-if(cocoaWidget&&/^11\.20$/.test(os_version),36-49,187329-187407) fuzzy-if(winWidget,0-21,0-360000) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # Bug 1934894 skip-if(Android) skip-if(winWidget&&swgl) fuzzy-if(Android,255-255,273726-273726) fuzzy-if(cocoaWidget,0-16,0-1718) fuzzy-if(cocoaWidget&&swgl,0-42,0-196694) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,40-42,187328-196694) fuzzy-if(appleSilicon,0-16,0-1874) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # Bug 1934894 skip-if(Android) skip-if(!(winWidget&&swgl)) fuzzy(0-35,0-8506) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.vp9.webm ../reftest_img.html?src=color_quads/720p.png skip-if(Android) skip-if(!(winWidget&&swgl)) fuzzy(0-35,0-8506) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.vp9.mp4 ../reftest_img.html?src=color_quads/720p.png @@ -32,17 +32,17 @@ skip-if(Android) skip-if(!(winWidget&&swgl)) fuzzy(0-35,0-8506) == ../reftest_vi # - # yuv420p10 -skip-if(Android) fuzzy(33-49,1870-2579) fuzzy-if(swgl,34-52,180421-270528) fuzzy-if(useDrawSnapshot,16-16,183840-183840) fuzzy-if(cocoaWidget,60-74,270329-271024) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm ../reftest_img.html?src=color_quads/720p.png +skip-if(Android) fuzzy(33-49,1870-2579) fuzzy-if(swgl,34-52,180421-270528) fuzzy-if(useDrawSnapshot,16-16,183840-183840) fuzzy-if(cocoaWidget,60-74,270329-271024) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),67-70,273726-287412) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm ../reftest_img.html?src=color_quads/720p.png skip-if(Android) fuzzy-if(cocoaWidget,0-12,0-187770) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm #[2] skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm skip-if(Android) fuzzy-if(cocoaWidget,0-12,0-187770) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm -skip-if(Android) fuzzy(33-49,174620-270059) fuzzy-if(!winWidget&&swgl,36-52,11553-11555) fuzzy-if(winWidget&&swgl,36-52,11554-187200) fuzzy-if(swgl&&cocoaWidget,34-50,11465-270059) fuzzy-if(useDrawSnapshot,20-20,186800-186800) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm ../reftest_img.html?src=color_quads/720p.png -skip-if(Android) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-12,0-274122) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),40-42,187329-196695) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm # Bug 1934894 +skip-if(Android) fuzzy(33-49,174620-270059) fuzzy-if(useDrawSnapshot,20-20,186800-186800) fuzzy-if(!winWidget&&swgl,36-52,11553-11555) fuzzy-if(swgl&&cocoaWidget,34-50,11465-270059) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),66-69,273726-287412) fuzzy-if(winWidget&&swgl,36-52,11554-187200) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm ../reftest_img.html?src=color_quads/720p.png +skip-if(Android) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-42,0-196695) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),0-42,0-196695) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm # Bug 1934894 skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm #[2] skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm -skip-if(Android) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-12,0-274122) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),40-42,187329-196695) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm # Bug 1934894 +skip-if(Android) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-42,0-196695) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),0-42,0-196695) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm # Bug 1934894 # Android is really broken in a variety of ways for p10. #[2]: yuv420p10 broken in h264.mp4: https://bugzilla.mozilla.org/show_bug.cgi?id=1711812 diff --git a/dom/media/test/reftest/reftest.list b/dom/media/test/reftest/reftest.list index 35b50478564..1598f676859 100644 --- a/dom/media/test/reftest/reftest.list +++ b/dom/media/test/reftest/reftest.list @@ -1,7 +1,7 @@ skip-if(Android) fuzzy-if(cocoaWidget,0-80,0-76800) fuzzy-if(appleSilicon,0-80,0-76800) fuzzy-if(winWidget,0-63,0-76799) fuzzy-if(gtkWidget,0-70,0-2032) HTTP(..) == short.mp4.firstframe.html short.mp4.firstframe-ref.html pref(media.seekToNextFrame.enabled,true) skip-if(Android) fuzzy-if(cocoaWidget,0-87,0-76797) fuzzy-if(appleSilicon,0-87,0-76797) fuzzy-if(winWidget,0-60,0-76797) fuzzy-if(gtkWidget,0-60,0-6070) HTTP(..) == short.mp4.lastframe.html short.mp4.lastframe-ref.html skip-if(Android) skip-if(cocoaWidget) skip-if(winWidget) fuzzy-if(gtkWidget,0-57,0-4282) fuzzy-if(cocoaWidget,55-80,4173-4417) HTTP(..) == bipbop_300_215kbps.mp4.lastframe.html bipbop_300_215kbps.mp4.lastframe-ref.html -skip-if(Android) fuzzy-if(cocoaWidget,0-25,0-175921) fuzzy-if(appleSilicon,34-34,40100-40100) fuzzy-if(winWidget,0-71,0-179198) fuzzy-if(gtkWidget,0-46,0-173482) HTTP(..) == gizmo.mp4.seek.html gizmo.mp4.55thframe-ref.html +skip-if(Android) fuzzy-if(cocoaWidget,0-25,0-175921) fuzzy-if(appleSilicon,0-34,0-40100) fuzzy-if(winWidget,0-71,0-179198) fuzzy-if(gtkWidget,0-46,0-173482) HTTP(..) == gizmo.mp4.seek.html gizmo.mp4.55thframe-ref.html # Bug 1758718 skip-if(Android) skip-if(cocoaWidget) fuzzy(0-10,0-778236) == image-10bits-rendering-video.html image-10bits-rendering-ref.html skip-if(Android) fuzzy(0-10,0-778536) fuzzy-if(appleSilicon,0-37,0-699614) == image-10bits-rendering-90-video.html image-10bits-rendering-90-ref.html diff --git a/dom/media/tests/crashtests/crashtests.list b/dom/media/tests/crashtests/crashtests.list index f6e2fcc563d..3d492d13e44 100644 --- a/dom/media/tests/crashtests/crashtests.list +++ b/dom/media/tests/crashtests/crashtests.list @@ -23,7 +23,7 @@ asserts-if(Android,0-1) pref(browser.link.open_newwindow,2) load 1429507_2.html load 1443212.html asserts-if(Android,0-2) load 1453030.html load 1468451.html -skip-if(wayland) skip-if(cocoaWidget&&/^14\.70$/.test(os_version)) skip-if(Android) load 1490700.html # wayland: bug 1856368, macOS bug 1932140, No screenshare on Android +skip-if(wayland) skip-if(cocoaWidget&&/^14\.70$/.test(os_version)) skip-if(cocoaWidget&&/^15\.30$/.test(os_version)) skip-if(Android) load 1490700.html # wayland: bug 1856368, macOS bug 1932140, No screenshare on Android load 1505957.html load 1509442.html load 1511130.html @@ -39,4 +39,4 @@ load 1764933.html load 1764940.html load 1766668.html load 1783765.html -skip-if(Android) load 1920264.html +skip-if(Android) skip-if(cocoaWidget&&/^15\.30$/.test(os_version)) load 1920264.html diff --git a/dom/media/webrtc/tests/crashtests/crashtests.list b/dom/media/webrtc/tests/crashtests/crashtests.list index 8bcf1e69ca1..43caafff456 100644 --- a/dom/media/webrtc/tests/crashtests/crashtests.list +++ b/dom/media/webrtc/tests/crashtests/crashtests.list @@ -5,5 +5,5 @@ load 1789908.html load 1799168.html load 1816708.html load 1821477.html -load 1903905.html +skip-if(cocoaWidget&&/^15\.30$/.test(os_version)) load 1903905.html pref(media.navigator.permission.device,true) pref(media.audio_loopback_dev,"real-device-request-with-clear-cache") load getUserMedia-audio.html # bug 1767893 diff --git a/dom/media/webrtc/tests/mochitests/mochitest_datachannel.toml b/dom/media/webrtc/tests/mochitests/mochitest_datachannel.toml index 24c6c2f2521..cb3beb51b3b 100644 --- a/dom/media/webrtc/tests/mochitests/mochitest_datachannel.toml +++ b/dom/media/webrtc/tests/mochitests/mochitest_datachannel.toml @@ -57,6 +57,9 @@ scheme = "http" ["test_dataChannel_hostnameObfuscation.html"] scheme = "http" +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1961560 +] ["test_dataChannel_noOffer.html"] scheme = "http" diff --git a/dom/media/webrtc/tests/mochitests/mochitest_peerconnection.toml b/dom/media/webrtc/tests/mochitests/mochitest_peerconnection.toml index 541a667c362..0408dc5939a 100644 --- a/dom/media/webrtc/tests/mochitests/mochitest_peerconnection.toml +++ b/dom/media/webrtc/tests/mochitests/mochitest_peerconnection.toml @@ -397,7 +397,10 @@ skip-if = ["os == 'android'"] # Bug 1614460 ["test_peerConnection_simulcastOffer_oldSetParameters.html"] ["test_peerConnection_simulcastOffer_screenshare.html"] -skip-if = ["os == 'android'"] # no screenshare on android +skip-if = [ + "os == 'android'", # no screenshare on android + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1941688 +] ["test_peerConnection_stats.html"] diff --git a/dom/quota/test/xpcshell/test_temporaryStorageEviction.js b/dom/quota/test/xpcshell/test_temporaryStorageEviction.js new file mode 100644 index 00000000000..427919120c9 --- /dev/null +++ b/dom/quota/test/xpcshell/test_temporaryStorageEviction.js @@ -0,0 +1,327 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +const { PrefUtils } = ChromeUtils.importESModule( + "resource://testing-common/dom/quota/test/modules/PrefUtils.sys.mjs" +); +const { PrincipalUtils } = ChromeUtils.importESModule( + "resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs" +); +const { QuotaUtils } = ChromeUtils.importESModule( + "resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs" +); +const { SimpleDBUtils } = ChromeUtils.importESModule( + "resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs" +); + +// This value is used to set dom.quotaManager.temporaryStorage.fixedLimit +// for this test, and must match the needs of the writes we plan to do. +// The storage size must be a multiple of (number of origins - 1) to ensure +// `dataSize` is a whole number. This is enforced below with a check to +// guarantee predictable writes. +const storageSizeKB = 32; + +/** + * This test simulates origin usage across five related stages, exercising: + * - Access time tracking on first and last access to each origin + * - Eviction logic based on activity and last access time + * - Usage reflection via QuotaManager's reporting APIs + * + * The test is data-driven: it defines a list of origins, each with a flag + * array representing whether data on disk is expected to exist after each + * stage. These flags are used to verify origin usage deterministically at each + * point. + * + * The total storage size is evenly divided among all origins except the last + * one. This ensures predictable write outcomes: + * - All but the last origin succeed in writing initially + * - The last origin exceeds quota and triggers eviction conditions + * + * Each stage simulates realistic temporary storage (AKA best-effort) behavior: + * Stage 1 - Initializes all origin directories in reverse to test access time + * updates + * Stage 2 - Opens connections and fills storage, leaving no room for the last + * origin + * Stage 3 - Closes most connections to allow eviction of inactive origins + * Stage 4 - Shrinks temporary storage by 50%, triggering additional evictions + * Stage 5 - Writes again to the last origin to validate ongoing eviction + * behavior + * + * This test ensures correctness and robustness of temporary storage handling, + * especially around eviction and access time policies. + */ +async function testTemporaryStorageEviction() { + const storageSize = storageSizeKB * 1024; + + // flags: [stage1, stage2, stage3, stage4, stage5] + // 1 = data on disk should exist, 0 = data on disk should not exist + + /* prettier-ignore */ + const originInfos = [ + { url: "https://www.alpha.com", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.beta.com", flags: [0, 1, 0, 0, 0] }, + { url: "https://www.gamma.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.delta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.epsilon.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.alpha.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.beta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.gamma.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.delta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.epsilon.com",flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.alpha.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.beta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.gamma.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.delta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.epsilon.com",flags: [0, 1, 1, 0, 0] }, + { url: "https://www.alpha.org", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.beta.org", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.gamma.org", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.delta.org", flags: [0, 1, 1, 1, 0] }, + { url: "https://www.epsilon.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.zeta.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.eta.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.theta.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.iota.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.kappa.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.lambda.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.mu.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.nu.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.xi.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.omicron.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.pi.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.rho.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.omega.org", flags: [0, 0, 1, 1, 1] }, + ]; + Assert.equal( + storageSize % (originInfos.length - 1), + 0, + "Correct storage size" + ); + + const name = "test_temporaryStorageEviction"; + + const dataSize = storageSize / (originInfos.length - 1); + const dataBuffer = new ArrayBuffer(dataSize); + + async function checkUsage(stage) { + for (const originInfo of originInfos) { + const url = originInfo.url; + + info(`Checking usage for ${url}`); + + const principal = PrincipalUtils.createPrincipal(url); + + const request = Services.qms.getUsageForPrincipal(principal, {}); + const usageResult = await QuotaUtils.requestFinished(request); + + if (originInfo.flags[stage - 1]) { + Assert.greater(usageResult.usage, 0, "Correct usage"); + } else { + Assert.equal(usageResult.usage, 0, "Correct usage"); + } + } + } + + async function createAndOpenConnection(url) { + const principal = PrincipalUtils.createPrincipal(url); + + const connection = SimpleDBUtils.createConnection(principal); + + const openRequest = connection.open(name); + await SimpleDBUtils.requestFinished(openRequest); + + return connection; + } + + info( + "Stage 1: Reverse creation of origins to test first/last access time updates" + ); + + // Initializes storage and temporary storage and creates all origin + // directories with metadata, in reverse order. This ensures that the + // "first access" and "last access" logic for updating origin access time is + // properly exercised in other stages. + + info("Initializing storage"); + + { + const request = Services.qms.init(); + await QuotaUtils.requestFinished(request); + } + + info("Initializing temporary storage"); + + { + const request = Services.qms.initTemporaryStorage(); + await QuotaUtils.requestFinished(request); + } + + info("Initializing temporary origins"); + + for (const originInfo of originInfos.toReversed()) { + const principal = PrincipalUtils.createPrincipal(originInfo.url); + + const request = Services.qms.initializeTemporaryOrigin( + "default", + principal, + /* aCreateIfNonExistent */ true + ); + await QuotaUtils.requestFinished(request); + + // Wait 40ms to ensure the next origin gets a different access time. Some + // systems have low timer resolution, so this adds a safe buffer. + await new Promise(function (resolve) { + do_timeout(40, resolve); + }); + } + + info("Checking usage"); + + await checkUsage(/* stage */ 1); + + info( + "Stage 2: All origins active; eviction not possible, last write should fail" + ); + + // Opens connections for all origins and writes data to each except the last + // one. Since all origins remain active (open connections), none can be + // evicted, even if storage runs out. This tests that eviction logic respects + // activity status. + + const connections = await (async function () { + let connections = []; + // Stage 1 + for (const originInfo of originInfos) { + const connection = await createAndOpenConnection(originInfo.url); + + connections.push(connection); + } + + return connections; + })(); + + // Write to all but the last origin. + for (const connection of connections.slice(0, -1)) { + const writeRequest = connection.write(dataBuffer); + await SimpleDBUtils.requestFinished(writeRequest); + } + + // Try to write to the last origin. + { + const writeRequest = connections.at(-1).write(dataBuffer); + try { + await SimpleDBUtils.requestFinished(writeRequest); + Assert.ok(false, "Should have thrown"); + } catch (e) { + Assert.ok(true, "Should have thrown"); + Assert.strictEqual( + e.resultCode, + NS_ERROR_FILE_NO_DEVICE_SPACE, + "Threw right result code" + ); + } + } + + await checkUsage(/* stage */ 2); + + info("Stage 3: Inactive origins can be evicted; last origin writes again"); + + // Closes all connections except the first and last origin. This leaves most + // origins inactive, making them eligible for eviction. The last origin + // writes data again, which should now succeed because there is at least one + // inactive origin that can be evicted to make space. + + // Close all connections except the first and the last + for (const connection of connections.slice(1, -1)) { + const closeRequest = connection.close(); + await SimpleDBUtils.requestFinished(closeRequest); + + // Wait 40ms to ensure the next origin gets a different access time. Some + // systems have low timer resolution, so this adds a safe buffer. + await new Promise(function (resolve) { + do_timeout(40, resolve); + }); + } + + // Write to the last origin. + { + const writeRequest = connections.at(-1).write(dataBuffer); + await SimpleDBUtils.requestFinished(writeRequest); + } + + await checkUsage(/* stage */ 3); + + info("Stage 4: Shrink quota by 50%; evict origins by last access time"); + + // Shrinks the temporary storage quota by 50%. This triggers eviction of + // approximately half of the origins based on their last access time. It + // tests that quota reduction correctly respects access time ordering when + // deciding which origins to evict. + + info("Shutting down storage"); + + { + const request = Services.qms.reset(); + await QuotaUtils.requestFinished(request); + } + + info("Setting preferences"); + + { + const prefs = [ + ["dom.quotaManager.temporaryStorage.fixedLimit", storageSizeKB / 2], + ]; + + PrefUtils.setPrefs(prefs); + } + + info("Initializing storage"); + + { + const request = Services.qms.init(); + await QuotaUtils.requestFinished(request); + } + + info("Initializing temporary storage"); + + { + const request = Services.qms.initTemporaryStorage(); + await QuotaUtils.requestFinished(request); + } + + await checkUsage(/* stage */ 4); + + info("Stage 5: Last origin writes more; one more origin should be evicted"); + + // The last origin writes additional data, which should exceed the current + // quota again. This triggers eviction of one more inactive origin, + // validating that eviction continues to respect quota limits and frees up + // space as needed. + + { + const connection = await createAndOpenConnection(originInfos.at(-1).url); + + const seekRequest = connection.seek(dataSize); + await SimpleDBUtils.requestFinished(seekRequest); + + const writeRequest = connection.write(dataBuffer); + await SimpleDBUtils.requestFinished(writeRequest); + } + + await checkUsage(/* stage */ 5); +} + +async function testSteps() { + add_task( + { + pref_set: [ + ["dom.quotaManager.loadQuotaFromCache", false], + ["dom.quotaManager.temporaryStorage.fixedLimit", storageSizeKB], + ["dom.quotaManager.temporaryStorage.updateOriginAccessTime", true], + ], + }, + testTemporaryStorageEviction + ); +} diff --git a/dom/quota/test/xpcshell/xpcshell.toml b/dom/quota/test/xpcshell/xpcshell.toml index e936dcc3671..fa086368040 100644 --- a/dom/quota/test/xpcshell/xpcshell.toml +++ b/dom/quota/test/xpcshell/xpcshell.toml @@ -155,6 +155,8 @@ skip-if = ["inc_origin_init"] ["test_tempMetadataCleanup.js"] +["test_temporaryStorageEviction.js"] + ["test_unaccessedOrigins.js"] ["test_unknownFiles.js"] diff --git a/dom/security/nsCSPUtils.cpp b/dom/security/nsCSPUtils.cpp index 8750dfa730e..62107bb635b 100644 --- a/dom/security/nsCSPUtils.cpp +++ b/dom/security/nsCSPUtils.cpp @@ -415,6 +415,28 @@ CSPDirective CSP_ContentTypeToDirective(nsContentPolicyType aType) { return nsIContentSecurityPolicy::DEFAULT_SRC_DIRECTIVE; } +already_AddRefed CSP_CreateFromHeader(const nsAString& aHeaderValue, nsIURI* aSelfURI, + nsIPrincipal* aLoadingPrincipal, + ErrorResult& aRv) { + RefPtr csp = new nsCSPContext(); + // Hard code some default values until we have a use case where we can provide + // something else. + // When inheriting from this CSP, these values will be overwritten anyway. + aRv = csp->SetRequestContextWithPrincipal(aLoadingPrincipal, aSelfURI, + /* aReferrer */ ""_ns, + /* aInnerWindowId */ 0); + if (aRv.Failed()) { + return nullptr; + } + + aRv = CSP_AppendCSPFromHeader(csp, aHeaderValue, /* aReportOnly */ false); + if (aRv.Failed()) { + return nullptr; + } + + return csp.forget(); +} + nsCSPHostSrc* CSP_CreateHostSrcFromSelfURI(nsIURI* aSelfURI) { // Create the host first nsCString host; diff --git a/dom/security/nsCSPUtils.h b/dom/security/nsCSPUtils.h index f66fc083fba..2c5cbda1fbd 100644 --- a/dom/security/nsCSPUtils.h +++ b/dom/security/nsCSPUtils.h @@ -13,6 +13,7 @@ #include "nsString.h" #include "nsTArray.h" #include "nsUnicharUtils.h" +#include "mozilla/ErrorResult.h" class nsIChannel; @@ -193,6 +194,10 @@ nsresult CSP_AppendCSPFromHeader(nsIContentSecurityPolicy* aCsp, /* =============== Helpers ================== */ +already_AddRefed CSP_CreateFromHeader(const nsAString& aHeaderValue, nsIURI* aSelfURI, + nsIPrincipal* aLoadingPrincipal, + mozilla::ErrorResult& aRv); + class nsCSPHostSrc; nsCSPHostSrc* CSP_CreateHostSrcFromSelfURI(nsIURI* aSelfURI); diff --git a/dom/security/nsContentSecurityUtils.cpp b/dom/security/nsContentSecurityUtils.cpp index 75e03fffc79..f8efeed076f 100644 --- a/dom/security/nsContentSecurityUtils.cpp +++ b/dom/security/nsContentSecurityUtils.cpp @@ -1347,6 +1347,7 @@ static nsLiteralCString sImgSrcDataBlobAllowList[] = { "chrome://browser/content/sidebar/sidebar-syncedtabs.html"_ns, "chrome://browser/content/spotlight.html"_ns, "chrome://browser/content/syncedtabs/sidebar.xhtml"_ns, + "chrome://browser/content/webext-panels.xhtml"_ns, "chrome://devtools/content/application/index.html"_ns, "chrome://devtools/content/framework/browser-toolbox/window.html"_ns, "chrome://devtools/content/framework/toolbox-window.xhtml"_ns, diff --git a/dom/security/test/https-first/browser.toml b/dom/security/test/https-first/browser.toml index 7045ddb6803..523f05db419 100644 --- a/dom/security/test/https-first/browser.toml +++ b/dom/security/test/https-first/browser.toml @@ -28,6 +28,7 @@ support-files = ["file_https_rr_no_downgrade.sjs"] skip-if = [ "os == 'mac' && os_version == '10.15'", "os == 'mac' && os_version == '11.20' && arch == 'aarch64'", # Bug 1950553 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt && socketprocess_networking", # Bug 1950553 ] ["browser_https_telemetry.js"] diff --git a/dom/serviceworkers/test/test_serviceworker_interfaces.js b/dom/serviceworkers/test/test_serviceworker_interfaces.js index d49deba7c4f..478fef56842 100644 --- a/dom/serviceworkers/test/test_serviceworker_interfaces.js +++ b/dom/serviceworkers/test/test_serviceworker_interfaces.js @@ -219,85 +219,85 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! "FormData", // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPU", isEarlyBetaOrEarlier: true }, + { name: "GPU", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapter", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapter", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapterInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapterInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroup", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroup", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroupLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroupLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBufferUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUBufferUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCanvasContext", isEarlyBetaOrEarlier: true }, + { name: "GPUCanvasContext", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUColorWrite", isEarlyBetaOrEarlier: true }, + { name: "GPUColorWrite", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationMessage", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationMessage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePipeline", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDevice", isEarlyBetaOrEarlier: true }, + { name: "GPUDevice", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDeviceLostInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUDeviceLostInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUError", isEarlyBetaOrEarlier: true }, + { name: "GPUError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUExternalTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUExternalTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUInternalError", isEarlyBetaOrEarlier: true }, + { name: "GPUInternalError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUMapMode", isEarlyBetaOrEarlier: true }, + { name: "GPUMapMode", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUOutOfMemoryError", isEarlyBetaOrEarlier: true }, + { name: "GPUOutOfMemoryError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineError", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQuerySet", isEarlyBetaOrEarlier: true }, + { name: "GPUQuerySet", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQueue", isEarlyBetaOrEarlier: true }, + { name: "GPUQueue", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundle", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundle", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundleEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundleEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPipeline", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSampler", isEarlyBetaOrEarlier: true }, + { name: "GPUSampler", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderModule", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderModule", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderStage", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderStage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedFeatures", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedLimits", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedLimits", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureView", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureView", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUUncapturedErrorEvent", isEarlyBetaOrEarlier: true }, + { name: "GPUUncapturedErrorEvent", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUValidationError", isEarlyBetaOrEarlier: true }, + { name: "GPUValidationError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! "Headers", // IMPORTANT: Do not change this list without review from a DOM peer! @@ -495,7 +495,7 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! "WindowClient", // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "WGSLLanguageFeatures", isEarlyBetaOrEarlier: true }, + { name: "WGSLLanguageFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! "WorkerGlobalScope", // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/dom/svg/DOMSVGLength.cpp b/dom/svg/DOMSVGLength.cpp index 9aecb648dd0..cc3fbf9fb6b 100644 --- a/dom/svg/DOMSVGLength.cpp +++ b/dom/svg/DOMSVGLength.cpp @@ -51,6 +51,7 @@ DOMSVGLength::DOMSVGLength(DOMSVGLengthList* aList, uint8_t aAttrEnum, mListIndex(aListIndex), mAttrEnum(aAttrEnum), mIsAnimValItem(aIsAnimValItem), + mIsInTearoffTable(false), mUnit(SVGLength_Binding::SVG_LENGTHTYPE_NUMBER) { MOZ_ASSERT(aList, "bad arg"); MOZ_ASSERT(mAttrEnum == aAttrEnum, "bitfield too small"); @@ -63,6 +64,7 @@ DOMSVGLength::DOMSVGLength() mListIndex(0), mAttrEnum(0), mIsAnimValItem(false), + mIsInTearoffTable(false), mUnit(SVGLength_Binding::SVG_LENGTHTYPE_NUMBER) {} DOMSVGLength::DOMSVGLength(SVGAnimatedLength* aVal, SVGElement* aSVGElement, @@ -71,6 +73,7 @@ DOMSVGLength::DOMSVGLength(SVGAnimatedLength* aVal, SVGElement* aSVGElement, mListIndex(0), mAttrEnum(aVal->mAttrEnum), mIsAnimValItem(aAnimVal), + mIsInTearoffTable(false), mUnit(SVGLength_Binding::SVG_LENGTHTYPE_NUMBER) { MOZ_ASSERT(aVal, "bad arg"); MOZ_ASSERT(mAttrEnum == aVal->mAttrEnum, "bitfield too small"); @@ -88,22 +91,33 @@ void DOMSVGLength::CleanupWeakRefs() { // Similarly, we must update the tearoff table to remove its (non-owning) // pointer to mVal. - if (nsCOMPtr svg = do_QueryInterface(mOwner)) { - auto& table = mIsAnimValItem ? sAnimSVGLengthTearOffTable - : sBaseSVGLengthTearOffTable; - table.RemoveTearoff(svg->GetAnimatedLength(mAttrEnum)); + if (mIsInTearoffTable) { + nsCOMPtr svg = do_QueryInterface(mOwner); + MOZ_ASSERT(svg, + "We need our svgElement reference in order to remove " + "ourselves from tearoff table..."); + if (MOZ_LIKELY(svg)) { + auto& table = mIsAnimValItem ? sAnimSVGLengthTearOffTable + : sBaseSVGLengthTearOffTable; + table.RemoveTearoff(svg->GetAnimatedLength(mAttrEnum)); + mIsInTearoffTable = false; + } } } already_AddRefed DOMSVGLength::GetTearOff(SVGAnimatedLength* aVal, SVGElement* aSVGElement, bool aAnimVal) { + MOZ_ASSERT(aVal && aSVGElement, "Expecting non-null aVal and aSVGElement"); + MOZ_ASSERT(aVal == aSVGElement->GetAnimatedLength(aVal->mAttrEnum), + "Mismatched aVal/SVGElement?"); auto& table = aAnimVal ? sAnimSVGLengthTearOffTable : sBaseSVGLengthTearOffTable; RefPtr domLength = table.GetTearoff(aVal); if (!domLength) { domLength = new DOMSVGLength(aVal, aSVGElement, aAnimVal); table.AddTearoff(aVal, domLength); + domLength->mIsInTearoffTable = true; } return domLength.forget(); diff --git a/dom/svg/DOMSVGLength.h b/dom/svg/DOMSVGLength.h index 9dc6096c654..07dad37e817 100644 --- a/dom/svg/DOMSVGLength.h +++ b/dom/svg/DOMSVGLength.h @@ -15,7 +15,7 @@ #include "mozilla/Attributes.h" #include "nsWrapperCache.h" -#define MOZ_SVG_LIST_INDEX_BIT_COUNT 22 // supports > 4 million list items +#define MOZ_SVG_LIST_INDEX_BIT_COUNT 21 // supports > 2 million list items namespace mozilla { @@ -204,6 +204,13 @@ class DOMSVGLength final : public nsWrapperCache { uint32_t mAttrEnum : 4; // supports up to 16 attributes uint32_t mIsAnimValItem : 1; + // Tracks whether we're in the tearoff table. Initialized to false in the + // ctor, but then immediately set to true after we're added to the table + // (unless we're an instance created via 'Copy()'; those never get added to + // the table). Updated to false when we're removed from the table (at which + // point we're being destructed or soon-to-be destructed). + uint32_t mIsInTearoffTable : 1; + // The following members are only used when we're not in a list: uint32_t mUnit : 5; // can handle 31 units (the 10 SVG 1.1 units + rem, vw, // vh, wm, calc + future additions) diff --git a/dom/svg/DOMSVGPoint.cpp b/dom/svg/DOMSVGPoint.cpp index 81be75a03b4..f3743941311 100644 --- a/dom/svg/DOMSVGPoint.cpp +++ b/dom/svg/DOMSVGPoint.cpp @@ -168,6 +168,7 @@ already_AddRefed DOMSVGPoint::GetTranslateTearOff( if (!domPoint) { domPoint = new DOMSVGPoint(aVal, aSVGSVGElement); sSVGTranslateTearOffTable.AddTearoff(aVal, domPoint); + domPoint->mIsInTearoffTable = true; } return domPoint.forget(); @@ -204,12 +205,18 @@ void DOMSVGPoint::CleanupWeakRefs() { pointList->mItems[mListIndex] = nullptr; } + if (mIsInTearoffTable) { + // Similarly, we must update the tearoff table to remove its (non-owning) + // pointer to mVal. + MOZ_ASSERT(mVal && mIsTranslatePoint, + "Tearoff table should only be used for translate-point objects " + "with non-null mVal (see GetTranslateTearOff and its callers)"); + sSVGTranslateTearOffTable.RemoveTearoff(mVal); + mIsInTearoffTable = false; + } + if (mVal) { - if (mIsTranslatePoint) { - // Similarly, we must update the tearoff table to remove its (non-owning) - // pointer to mVal. - sSVGTranslateTearOffTable.RemoveTearoff(mVal); - } else { + if (!mIsTranslatePoint) { // In this case we own mVal delete mVal; } diff --git a/dom/svg/DOMSVGPoint.h b/dom/svg/DOMSVGPoint.h index eeea3d3075d..f36dbc9550d 100644 --- a/dom/svg/DOMSVGPoint.h +++ b/dom/svg/DOMSVGPoint.h @@ -17,7 +17,7 @@ #include "mozilla/dom/SVGSVGElement.h" #include "mozilla/gfx/2D.h" -#define MOZ_SVG_LIST_INDEX_BIT_COUNT 30 +#define MOZ_SVG_LIST_INDEX_BIT_COUNT 29 namespace mozilla::dom { struct DOMMatrix2DInit; @@ -51,7 +51,8 @@ class DOMSVGPoint final : public nsWrapperCache { mOwner(aList), mListIndex(aListIndex), mIsAnimValItem(aIsAnimValItem), - mIsTranslatePoint(false) { + mIsTranslatePoint(false), + mIsInTearoffTable(false) { // These shifts are in sync with the members. MOZ_ASSERT(aList && aListIndex <= MaxListIndex(), "bad arg"); @@ -60,7 +61,10 @@ class DOMSVGPoint final : public nsWrapperCache { // Constructor for unowned points and SVGSVGElement.createSVGPoint explicit DOMSVGPoint(const Point& aPt) - : mListIndex(0), mIsAnimValItem(false), mIsTranslatePoint(false) { + : mListIndex(0), + mIsAnimValItem(false), + mIsTranslatePoint(false), + mIsInTearoffTable(false) { // In this case we own mVal mVal = new SVGPoint(aPt.x, aPt.y); } @@ -72,7 +76,8 @@ class DOMSVGPoint final : public nsWrapperCache { mOwner(ToSupports(aSVGSVGElement)), mListIndex(0), mIsAnimValItem(false), - mIsTranslatePoint(true) {} + mIsTranslatePoint(true), + mIsInTearoffTable(false) {} virtual ~DOMSVGPoint() { CleanupWeakRefs(); } @@ -178,6 +183,12 @@ class DOMSVGPoint final : public nsWrapperCache { uint32_t mListIndex : MOZ_SVG_LIST_INDEX_BIT_COUNT; uint32_t mIsAnimValItem : 1; // True if We're the animated value of a list uint32_t mIsTranslatePoint : 1; // true iff our owner is a SVGSVGElement + + // Tracks whether we're in the tearoff table. Initialized to false in the + // ctor, but then immediately set to true if/when we're added to the table + // (not all instances are). Updated to false when we're removed from the + // table (at which point we're being destructed or soon-to-be destructed). + uint32_t mIsInTearoffTable : 1; }; } // namespace mozilla::dom diff --git a/dom/svg/DOMSVGPointList.cpp b/dom/svg/DOMSVGPointList.cpp index a9153998a1e..6e820ae1ae1 100644 --- a/dom/svg/DOMSVGPointList.cpp +++ b/dom/svg/DOMSVGPointList.cpp @@ -90,9 +90,12 @@ void DOMSVGPointList::RemoveFromTearoffTable() { // // There are now no longer any references to us held by script or list items. // Note we must use GetAnimValKey/GetBaseValKey here, NOT InternalList()! - void* key = mIsAnimValList ? InternalAList().GetAnimValKey() - : InternalAList().GetBaseValKey(); - SVGPointListTearoffTable().RemoveTearoff(key); + if (mIsInTearoffTable) { + void* key = mIsAnimValList ? InternalAList().GetAnimValKey() + : InternalAList().GetBaseValKey(); + SVGPointListTearoffTable().RemoveTearoff(key); + mIsInTearoffTable = false; + } } DOMSVGPointList::~DOMSVGPointList() { RemoveFromTearoffTable(); } diff --git a/dom/svg/DOMSVGPointList.h b/dom/svg/DOMSVGPointList.h index af35f25270a..5961d0d8114 100644 --- a/dom/svg/DOMSVGPointList.h +++ b/dom/svg/DOMSVGPointList.h @@ -245,6 +245,12 @@ class DOMSVGPointList final : public nsISupports, public nsWrapperCache { RefPtr mElement; bool mIsAnimValList; + + // Tracks whether we're in the tearoff table. Initialized to true, since all + // new instances are added to the table right after construction. Updated to + // false when we're removed from the table (at which point we're being + // destructed or soon-to-be destructed). + bool mIsInTearoffTable = true; }; NS_DEFINE_STATIC_IID_ACCESSOR(DOMSVGPointList, MOZILLA_DOMSVGPOINTLIST_IID) diff --git a/dom/svg/DOMSVGStringList.cpp b/dom/svg/DOMSVGStringList.cpp index 89484427415..e49218d94cd 100644 --- a/dom/svg/DOMSVGStringList.cpp +++ b/dom/svg/DOMSVGStringList.cpp @@ -91,7 +91,10 @@ already_AddRefed DOMSVGStringList::GetDOMWrapper( void DOMSVGStringList::RemoveFromTearoffTable() { // Script no longer has any references to us. - SVGStringListTearoffTable().RemoveTearoff(&InternalList()); + if (mIsInTearoffTable) { + SVGStringListTearoffTable().RemoveTearoff(&InternalList()); + mIsInTearoffTable = false; + } } DOMSVGStringList::~DOMSVGStringList() { RemoveFromTearoffTable(); } diff --git a/dom/svg/DOMSVGStringList.h b/dom/svg/DOMSVGStringList.h index 5c05294d479..6b43220ec04 100644 --- a/dom/svg/DOMSVGStringList.h +++ b/dom/svg/DOMSVGStringList.h @@ -108,6 +108,12 @@ class DOMSVGStringList final : public nsISupports, public nsWrapperCache { uint8_t mAttrEnum; bool mIsConditionalProcessingAttribute; + + // Tracks whether we're in the tearoff table. Initialized to true, since all + // new instances are added to the table right after construction. Updated to + // false when we're removed from the table (at which point we're being + // destructed or soon-to-be destructed). + bool mIsInTearoffTable = true; }; } // namespace dom diff --git a/dom/tests/mochitest/general/test_interfaces.js b/dom/tests/mochitest/general/test_interfaces.js index 0f27602f62b..d58160eff80 100644 --- a/dom/tests/mochitest/general/test_interfaces.js +++ b/dom/tests/mochitest/general/test_interfaces.js @@ -504,85 +504,85 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "GeolocationPositionError", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPU", isEarlyBetaOrEarlier: true }, + { name: "GPU", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapter", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapter", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapterInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapterInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroup", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroup", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroupLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroupLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBufferUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUBufferUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCanvasContext", isEarlyBetaOrEarlier: true }, + { name: "GPUCanvasContext", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUColorWrite", isEarlyBetaOrEarlier: true }, + { name: "GPUColorWrite", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationMessage", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationMessage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePipeline", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDevice", isEarlyBetaOrEarlier: true }, + { name: "GPUDevice", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDeviceLostInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUDeviceLostInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUError", isEarlyBetaOrEarlier: true }, + { name: "GPUError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUExternalTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUExternalTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUInternalError", isEarlyBetaOrEarlier: true }, + { name: "GPUInternalError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUMapMode", isEarlyBetaOrEarlier: true }, + { name: "GPUMapMode", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUOutOfMemoryError", isEarlyBetaOrEarlier: true }, + { name: "GPUOutOfMemoryError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineError", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQuerySet", isEarlyBetaOrEarlier: true }, + { name: "GPUQuerySet", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQueue", isEarlyBetaOrEarlier: true }, + { name: "GPUQueue", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundle", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundle", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundleEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundleEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPipeline", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSampler", isEarlyBetaOrEarlier: true }, + { name: "GPUSampler", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderModule", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderModule", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderStage", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderStage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedFeatures", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedLimits", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedLimits", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureView", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureView", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUUncapturedErrorEvent", isEarlyBetaOrEarlier: true }, + { name: "GPUUncapturedErrorEvent", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUValidationError", isEarlyBetaOrEarlier: true }, + { name: "GPUValidationError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "HashChangeEvent", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! @@ -1551,7 +1551,7 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Window", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "WGSLLanguageFeatures", isEarlyBetaOrEarlier: true }, + { name: "WGSLLanguageFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Worker", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/dom/view-transitions/ViewTransition.cpp b/dom/view-transitions/ViewTransition.cpp index 1b238df22c4..1f9e75d4e29 100644 --- a/dom/view-transitions/ViewTransition.cpp +++ b/dom/view-transitions/ViewTransition.cpp @@ -66,6 +66,11 @@ static CSSToCSSMatrix4x4Flagged EffectiveTransform(nsIFrame* aFrame) { float sy = boundingRect.height / untransformedSize.height; matrix = CSSToCSSMatrix4x4Flagged::Scaling(sx, sy, 0.0f); } + auto inkOverflowOffset = aFrame->InkOverflowRectRelativeToSelf().TopLeft(); + if (inkOverflowOffset != nsPoint()) { + auto cssOffset = CSSPoint::FromAppUnits(inkOverflowOffset); + matrix.PostTranslate(cssOffset.x, cssOffset.y, 0.0f); + } if (boundingRect.TopLeft() != CSSPoint()) { matrix.PostTranslate(boundingRect.x, boundingRect.y, 0.0f); } @@ -190,7 +195,7 @@ struct CapturedElementOldState { mTriedImage(true), mSize(aFrame->Style()->IsRootElementStyle() ? aSnapshotContainingBlockSize - : aFrame->GetRect().Size()), + : aFrame->InkOverflowRect().Size()), mTransform(EffectiveTransform(aFrame)), mWritingMode(aFrame->StyleVisibility()->mWritingMode), mDirection(aFrame->StyleVisibility()->mDirection), @@ -825,9 +830,12 @@ bool ViewTransition::UpdatePseudoElementStyles(bool aNeedsInvalidation) { auto* rule = EnsureRule(capturedElement.mGroupRule); // Let newRect be snapshot containing block if capturedElement is the // document element, otherwise, capturedElement’s border box. + // NOTE: Needs ink overflow rect instead to get the correct rendering, see + // https://github.com/w3c/csswg-drafts/issues/12092. + // TODO(emilio, bug 1961139): Maybe revisit this. auto newRect = frame->Style()->IsRootElementStyle() ? SnapshotContainingBlockRect() - : frame->GetRect(); + : frame->InkOverflowRectRelativeToSelf(); auto size = CSSPixel::FromAppUnits(newRect); // NOTE(emilio): Intentionally not short-circuiting. Int cast is needed to // silence warning. diff --git a/dom/webgpu/moz.build b/dom/webgpu/moz.build index 2f81e59df40..76e1a72d4fc 100644 --- a/dom/webgpu/moz.build +++ b/dom/webgpu/moz.build @@ -8,10 +8,10 @@ with Files("**"): BUG_COMPONENT = ("Core", "Graphics: WebGPU") MOCHITEST_MANIFESTS += [ - "mochitest/mochitest-no-pref.toml", - "mochitest/mochitest-resistfingerprinting.toml", - "mochitest/mochitest.toml", - "mochitest/perftest.toml", + "tests/mochitest/mochitest-no-pref.toml", + "tests/mochitest/mochitest-resistfingerprinting.toml", + "tests/mochitest/mochitest.toml", + "tests/mochitest/perftest.toml", ] DIRS += [] diff --git a/dom/webgpu/tests/cts/vendor/Cargo.lock b/dom/webgpu/tests/cts/vendor/Cargo.lock index e41aab35036..901b4a003d4 100644 --- a/dom/webgpu/tests/cts/vendor/Cargo.lock +++ b/dom/webgpu/tests/cts/vendor/Cargo.lock @@ -286,6 +286,12 @@ dependencies = [ "either", ] +[[package]] +name = "joinery" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d8bde02bbf44a562cf068a8ff4a68842df387e302a03a4de4a57fcf82ec377" + [[package]] name = "libc" version = "0.2.171" @@ -688,6 +694,7 @@ dependencies = [ "ezcmd", "format", "itertools", + "joinery", "log", "miette", "regex", diff --git a/dom/webgpu/tests/cts/vendor/Cargo.toml b/dom/webgpu/tests/cts/vendor/Cargo.toml index 30a69839b64..9695c77061f 100644 --- a/dom/webgpu/tests/cts/vendor/Cargo.toml +++ b/dom/webgpu/tests/cts/vendor/Cargo.toml @@ -10,6 +10,7 @@ env_logger = "0.10.0" ezcmd = "0.3.0" format = "0.2.4" itertools = "0.11.0" +joinery = "3.1.0" log = "0.4.17" miette = { version = "7.5.0", features = ["fancy"] } regex = "1.7.1" diff --git a/dom/webgpu/tests/cts/vendor/src/main.rs b/dom/webgpu/tests/cts/vendor/src/main.rs index 0663cf35715..6542d2889e0 100644 --- a/dom/webgpu/tests/cts/vendor/src/main.rs +++ b/dom/webgpu/tests/cts/vendor/src/main.rs @@ -3,12 +3,13 @@ use std::{ collections::{BTreeMap, BTreeSet}, env::set_current_dir, path::PathBuf, - process::ExitCode, + process::{ExitCode, Stdio}, }; use clap::Parser; use ezcmd::EasyCommand; use itertools::Itertools; +use joinery::JoinableIterator; use miette::{ensure, miette, Context, Diagnostic, IntoDiagnostic, Report, SourceSpan}; use regex::Regex; @@ -19,6 +20,7 @@ use crate::{ mod fs; mod process; +mod test_split; /// Vendor WebGPU CTS tests from a local Git checkout of [our `gpuweb/cts` fork]. /// @@ -57,6 +59,8 @@ fn run(args: CliArgs) -> miette::Result<()> { let npm_bin = which("npm", "NPM binary")?; + let node_bin = which("node", "Node.js binary")?; + set_current_dir(&*cts_ckt) .into_diagnostic() .wrap_err("failed to change working directory to CTS checkout")?; @@ -260,6 +264,54 @@ fn run(args: CliArgs) -> miette::Result<()> { log::info!(" …found {} test cases", cts_cases.len()); } + let test_listing_buf; + let mut tests_to_split = { + log::info!("generating index of tests to split…"); + + let test_split_config = { + use test_split::*; + [( + "webgpu:api,operation,command_buffer,image_copy:mip_levels", + Config { + new_sibling_basename: "image_copy__mip_levels", + split_by: SplitBy::first_param( + "initMethod", + SplitParamsTo::SeparateTestsInSameFile, + ), + }, + )] + }; + + let mut tests_to_split = test_split_config + .into_iter() + .map(|(test_path, config)| (test_path, test_split::Entry::from_config(config))) + .collect::>(); + + let mut cmd = EasyCommand::new_with(&node_bin, |cmd| { + cmd.args(["tools/run_node", "--list", "webgpu:*"]) + .stderr(Stdio::inherit()) + }); + log::info!(" requesting exhaustive list of tests using {cmd}…"); + test_listing_buf = { + let stdout = cmd.output().into_diagnostic()?.stdout; + String::from_utf8(stdout) + .into_diagnostic() + .context("failed to read output of exhaustive test listing command")? + }; + + log::info!(" building index from list of tests…"); + for full_path in test_listing_buf.lines() { + let (subtest_path, params) = split_at_nth_colon(2, full_path) + .wrap_err_with(|| "failed to parse configured split entry")?; + if let Some(entry) = tests_to_split.get_mut(subtest_path) { + entry.process_listing_line(params)?; + } + } + test_split::assert_seen(tests_to_split.iter(), |seen| &seen.listing); + + tests_to_split + }; + cts_ckt.regen_dir(out_wpt_dir.join("cts"), |cts_tests_dir| { log::info!("re-distributing tests into single file per test path…"); let mut failed_writing = false; @@ -303,11 +355,50 @@ fn run(args: CliArgs) -> miette::Result<()> { } }; let (test_group_path, _test_name) = test_path.rsplit_once(':').unwrap(); + let test_group_path_components = test_group_path.split([':', ',']); - let slashed = test_group_path.replace([':', ','], "/"); - insert!(&slashed, meta.into()); + if let Some(entry) = tests_to_split.get_mut(test_path) { + let test_split::Entry { seen, ref config } = entry; + let test_split::Config { + new_sibling_basename, + split_by, + } = config; + + let file_path = test_group_path_components + .chain([*new_sibling_basename]) + .join_with("/") + .to_string(); + + seen.wpt_files = true; + + match split_by { + test_split::SplitBy::FirstParam { + expected_name, + split_to, + observed_values, + } => match split_to { + test_split::SplitParamsTo::SeparateTestsInSameFile => { + for value in observed_values { + let new_meta = meta.replace( + &*path, + &format!("{test_path}:{expected_name}={value};*"), + ); + assert_ne!(meta, new_meta); + insert!(&file_path, new_meta.into()); + } + } + }, + } + } else { + insert!( + &test_group_path_components.join_with("/").to_string(), + meta.into() + ) + }; } + test_split::assert_seen(tests_to_split.iter(), |seen| &seen.wpt_files); + struct WptEntry<'a> { cases: BTreeSet>, timeout_length: TimeoutLength, diff --git a/dom/webgpu/tests/cts/vendor/src/test_split.rs b/dom/webgpu/tests/cts/vendor/src/test_split.rs new file mode 100644 index 00000000000..772560690c1 --- /dev/null +++ b/dom/webgpu/tests/cts/vendor/src/test_split.rs @@ -0,0 +1,202 @@ +//! Functionality for splitting CTS tests at certain paths into more tests and files in +//! [`crate::main`]. + +use std::collections::BTreeSet; + +/// The value portion of a key-value pair used in [`crate::main`] to split tests into more tests or +/// files. +#[derive(Debug)] +pub(crate) struct Config { + /// The new base name used for the sibling directory that this entry will split off from the + /// original CTS test. + /// + /// Chunking WPT tests happens at a directory level in Firefox's CI. If we split into a child + /// directory, instead of a sibling directory, then we would actually cause the child test to + /// be run in multiple chunks. Therefore, it's required to split tests into siblings. + pub new_sibling_basename: &'static str, + /// How to split the test this entry refers to. + pub split_by: SplitBy, +} + +impl Config { + pub fn map_observed_values(self, f: impl FnOnce(O) -> T) -> Config { + let Self { + new_sibling_basename, + split_by, + } = self; + Config { + new_sibling_basename, + split_by: split_by.map_observed_values(f), + } + } +} + +/// A [`Config::split_by`] value. +#[derive(Debug)] +pub(crate) enum SplitBy { + FirstParam { + /// The name of the first parameter in the test, to be used as validation that we are + /// actually pointing to the correct test. + expected_name: &'static str, + /// The method by which a test should be divided. + split_to: SplitParamsTo, + /// Values collected during [`Entry::process`], corresponding to a new test entry each. + observed_values: O, + }, +} + +impl SplitBy<()> { + /// Convenience for constructing [`SplitBy::FirstParam`]. + pub fn first_param(name: &'static str, split_to: SplitParamsTo) -> Self { + Self::FirstParam { + expected_name: name, + split_to, + observed_values: (), + } + } +} + +impl SplitBy { + pub fn map_observed_values(self, f: impl FnOnce(O) -> T) -> SplitBy { + match self { + Self::FirstParam { + expected_name, + split_to, + observed_values, + } => { + let observed_values = f(observed_values); + SplitBy::FirstParam { + expected_name, + split_to, + observed_values, + } + } + } + } +} + +/// A [SplitBy::FirstParam::split_to]. +#[derive(Debug)] +pub(crate) enum SplitParamsTo { + /// Place new test entries as siblings in the same file. + SeparateTestsInSameFile, +} + +#[derive(Debug)] +pub(crate) struct Entry<'a> { + /// Whether this + pub seen: SeenIn, + pub config: Config>, +} + +impl Entry<'_> { + pub fn from_config(config: Config<()>) -> Self { + Self { + seen: SeenIn::nowhere(), + config: config.map_observed_values(|()| BTreeSet::new()), + } + } +} + +/// An [`Entry::seen`]. +#[derive(Debug, Default)] +pub(crate) struct SeenIn { + pub listing: bool, + pub wpt_files: bool, +} + +impl SeenIn { + /// Default value: all seen locations set to `false`. + pub fn nowhere() -> Self { + Self::default() + } +} + +impl<'a> Entry<'a> { + /// Accumulates a line from the test listing script in upstream CTS. + /// + /// Line is expected to have a full CTS test path, including at least one case parameter, i.e.: + /// + /// ``` + /// webgpu:path,to,test,group:test:param1="value1";… + /// ``` + /// + /// Note that `;…` is not strictly necessary, when there is only a single case parameter for + /// the test. + /// + /// See [`crate::main`] for more details on how upstream CTS' listing script is invoked. + pub(crate) fn process_listing_line( + &mut self, + test_group_and_later_path: &'a str, + ) -> miette::Result<()> { + let rest = test_group_and_later_path; + + let Self { seen, config } = self; + + let Config { + new_sibling_basename: _, + split_by, + } = config; + + match split_by { + SplitBy::FirstParam { + ref expected_name, + split_to: _, + observed_values, + } => { + // NOTE: This only parses strings with no escaped characters. We may need different + // values later, at which point we'll have to consider what to do here. + let (ident, rest) = rest.split_once("=").ok_or_else(|| { + miette::diagnostic!("failed to get start of value of first arg") + })?; + + if ident != *expected_name { + return Err(miette::diagnostic!( + "expected {:?}, got {:?}", + expected_name, + ident + ) + .into()); + } + + let value = rest + .split_once(';') + .map(|(value, _rest)| value) + .unwrap_or(rest); + + // TODO: parse as JSON? + + observed_values.insert(value); + } + } + seen.listing = true; + + Ok(()) + } +} + +/// Iterate over `entries`' [`seen` members](Entry::seen), accumulating one of their fields and +/// panicking if any are `false` +/// +/// Used in [`crate::main`] to check that a specific [`Entry::seen`] fields have been set to `true` +/// for each entry configured. +pub(crate) fn assert_seen<'a>( + entries: impl Iterator)>, + mut in_: impl FnMut(&'a SeenIn) -> &'a bool, +) { + let mut unseen = Vec::new(); + entries.for_each(|(test_path, entry)| { + if !*in_(&entry.seen) { + unseen.push(test_path); + } + }); + if !unseen.is_empty() { + panic!( + concat!( + "did not find the following test split config. entries ", + "in test listing output: {:#?}", + ), + unseen + ); + } +} diff --git a/dom/webgpu/mochitest/mochitest-no-pref.toml b/dom/webgpu/tests/mochitest/mochitest-no-pref.toml similarity index 100% rename from dom/webgpu/mochitest/mochitest-no-pref.toml rename to dom/webgpu/tests/mochitest/mochitest-no-pref.toml diff --git a/dom/webgpu/mochitest/mochitest-resistfingerprinting.toml b/dom/webgpu/tests/mochitest/mochitest-resistfingerprinting.toml similarity index 100% rename from dom/webgpu/mochitest/mochitest-resistfingerprinting.toml rename to dom/webgpu/tests/mochitest/mochitest-resistfingerprinting.toml diff --git a/dom/webgpu/mochitest/mochitest.toml b/dom/webgpu/tests/mochitest/mochitest.toml similarity index 100% rename from dom/webgpu/mochitest/mochitest.toml rename to dom/webgpu/tests/mochitest/mochitest.toml diff --git a/dom/webgpu/mochitest/perftest.toml b/dom/webgpu/tests/mochitest/perftest.toml similarity index 100% rename from dom/webgpu/mochitest/perftest.toml rename to dom/webgpu/tests/mochitest/perftest.toml diff --git a/dom/webgpu/mochitest/test_basic_canvas.worker.html b/dom/webgpu/tests/mochitest/test_basic_canvas.worker.html similarity index 100% rename from dom/webgpu/mochitest/test_basic_canvas.worker.html rename to dom/webgpu/tests/mochitest/test_basic_canvas.worker.html diff --git a/dom/webgpu/mochitest/test_basic_canvas.worker.js b/dom/webgpu/tests/mochitest/test_basic_canvas.worker.js similarity index 100% rename from dom/webgpu/mochitest/test_basic_canvas.worker.js rename to dom/webgpu/tests/mochitest/test_basic_canvas.worker.js diff --git a/dom/webgpu/mochitest/test_buffer_mapping.html b/dom/webgpu/tests/mochitest/test_buffer_mapping.html similarity index 100% rename from dom/webgpu/mochitest/test_buffer_mapping.html rename to dom/webgpu/tests/mochitest/test_buffer_mapping.html diff --git a/dom/webgpu/mochitest/test_buffer_mapping_invalid_device.html b/dom/webgpu/tests/mochitest/test_buffer_mapping_invalid_device.html similarity index 100% rename from dom/webgpu/mochitest/test_buffer_mapping_invalid_device.html rename to dom/webgpu/tests/mochitest/test_buffer_mapping_invalid_device.html diff --git a/dom/webgpu/mochitest/test_buffer_mapping_overlapping_views.html b/dom/webgpu/tests/mochitest/test_buffer_mapping_overlapping_views.html similarity index 100% rename from dom/webgpu/mochitest/test_buffer_mapping_overlapping_views.html rename to dom/webgpu/tests/mochitest/test_buffer_mapping_overlapping_views.html diff --git a/dom/webgpu/mochitest/test_command_buffer_creation.html b/dom/webgpu/tests/mochitest/test_command_buffer_creation.html similarity index 100% rename from dom/webgpu/mochitest/test_command_buffer_creation.html rename to dom/webgpu/tests/mochitest/test_command_buffer_creation.html diff --git a/dom/webgpu/mochitest/test_compilation_message_pos.html b/dom/webgpu/tests/mochitest/test_compilation_message_pos.html similarity index 100% rename from dom/webgpu/mochitest/test_compilation_message_pos.html rename to dom/webgpu/tests/mochitest/test_compilation_message_pos.html diff --git a/dom/webgpu/mochitest/test_context_configure.html b/dom/webgpu/tests/mochitest/test_context_configure.html similarity index 100% rename from dom/webgpu/mochitest/test_context_configure.html rename to dom/webgpu/tests/mochitest/test_context_configure.html diff --git a/dom/webgpu/mochitest/test_core_features_and_limits.html b/dom/webgpu/tests/mochitest/test_core_features_and_limits.html similarity index 100% rename from dom/webgpu/mochitest/test_core_features_and_limits.html rename to dom/webgpu/tests/mochitest/test_core_features_and_limits.html diff --git a/dom/webgpu/mochitest/test_device_creation.html b/dom/webgpu/tests/mochitest/test_device_creation.html similarity index 100% rename from dom/webgpu/mochitest/test_device_creation.html rename to dom/webgpu/tests/mochitest/test_device_creation.html diff --git a/dom/webgpu/mochitest/test_device_lost.html b/dom/webgpu/tests/mochitest/test_device_lost.html similarity index 100% rename from dom/webgpu/mochitest/test_device_lost.html rename to dom/webgpu/tests/mochitest/test_device_lost.html diff --git a/dom/webgpu/mochitest/test_disabled.html b/dom/webgpu/tests/mochitest/test_disabled.html similarity index 100% rename from dom/webgpu/mochitest/test_disabled.html rename to dom/webgpu/tests/mochitest/test_disabled.html diff --git a/dom/webgpu/mochitest/test_double_encoder_finish.html b/dom/webgpu/tests/mochitest/test_double_encoder_finish.html similarity index 100% rename from dom/webgpu/mochitest/test_double_encoder_finish.html rename to dom/webgpu/tests/mochitest/test_double_encoder_finish.html diff --git a/dom/webgpu/mochitest/test_enabled.html b/dom/webgpu/tests/mochitest/test_enabled.html similarity index 100% rename from dom/webgpu/mochitest/test_enabled.html rename to dom/webgpu/tests/mochitest/test_enabled.html diff --git a/dom/webgpu/mochitest/test_encoder_cycle_collection.html b/dom/webgpu/tests/mochitest/test_encoder_cycle_collection.html similarity index 100% rename from dom/webgpu/mochitest/test_encoder_cycle_collection.html rename to dom/webgpu/tests/mochitest/test_encoder_cycle_collection.html diff --git a/dom/webgpu/mochitest/test_error_scope.html b/dom/webgpu/tests/mochitest/test_error_scope.html similarity index 100% rename from dom/webgpu/mochitest/test_error_scope.html rename to dom/webgpu/tests/mochitest/test_error_scope.html diff --git a/dom/webgpu/mochitest/test_insecure_context.html b/dom/webgpu/tests/mochitest/test_insecure_context.html similarity index 100% rename from dom/webgpu/mochitest/test_insecure_context.html rename to dom/webgpu/tests/mochitest/test_insecure_context.html diff --git a/dom/webgpu/mochitest/test_navigator_gpu_not_replaceable.html b/dom/webgpu/tests/mochitest/test_navigator_gpu_not_replaceable.html similarity index 100% rename from dom/webgpu/mochitest/test_navigator_gpu_not_replaceable.html rename to dom/webgpu/tests/mochitest/test_navigator_gpu_not_replaceable.html diff --git a/dom/webgpu/mochitest/test_queue_copyExternalImageToTexture.html b/dom/webgpu/tests/mochitest/test_queue_copyExternalImageToTexture.html similarity index 100% rename from dom/webgpu/mochitest/test_queue_copyExternalImageToTexture.html rename to dom/webgpu/tests/mochitest/test_queue_copyExternalImageToTexture.html diff --git a/dom/webgpu/mochitest/test_queue_write.html b/dom/webgpu/tests/mochitest/test_queue_write.html similarity index 100% rename from dom/webgpu/mochitest/test_queue_write.html rename to dom/webgpu/tests/mochitest/test_queue_write.html diff --git a/dom/webgpu/mochitest/test_queue_write_invalid_device.html b/dom/webgpu/tests/mochitest/test_queue_write_invalid_device.html similarity index 100% rename from dom/webgpu/mochitest/test_queue_write_invalid_device.html rename to dom/webgpu/tests/mochitest/test_queue_write_invalid_device.html diff --git a/dom/webgpu/mochitest/test_queue_write_perf.html b/dom/webgpu/tests/mochitest/test_queue_write_perf.html similarity index 100% rename from dom/webgpu/mochitest/test_queue_write_perf.html rename to dom/webgpu/tests/mochitest/test_queue_write_perf.html diff --git a/dom/webgpu/mochitest/test_rfp_clamp_limits_off.html b/dom/webgpu/tests/mochitest/test_rfp_clamp_limits_off.html similarity index 100% rename from dom/webgpu/mochitest/test_rfp_clamp_limits_off.html rename to dom/webgpu/tests/mochitest/test_rfp_clamp_limits_off.html diff --git a/dom/webgpu/mochitest/test_rfp_clamp_limits_on.html b/dom/webgpu/tests/mochitest/test_rfp_clamp_limits_on.html similarity index 100% rename from dom/webgpu/mochitest/test_rfp_clamp_limits_on.html rename to dom/webgpu/tests/mochitest/test_rfp_clamp_limits_on.html diff --git a/dom/webgpu/mochitest/test_set_bind_group_null.html b/dom/webgpu/tests/mochitest/test_set_bind_group_null.html similarity index 100% rename from dom/webgpu/mochitest/test_set_bind_group_null.html rename to dom/webgpu/tests/mochitest/test_set_bind_group_null.html diff --git a/dom/webgpu/mochitest/test_shared_array_buffer.html b/dom/webgpu/tests/mochitest/test_shared_array_buffer.html similarity index 100% rename from dom/webgpu/mochitest/test_shared_array_buffer.html rename to dom/webgpu/tests/mochitest/test_shared_array_buffer.html diff --git a/dom/webgpu/mochitest/test_submit_compute_empty.html b/dom/webgpu/tests/mochitest/test_submit_compute_empty.html similarity index 100% rename from dom/webgpu/mochitest/test_submit_compute_empty.html rename to dom/webgpu/tests/mochitest/test_submit_compute_empty.html diff --git a/dom/webgpu/mochitest/test_submit_render_empty.html b/dom/webgpu/tests/mochitest/test_submit_render_empty.html similarity index 100% rename from dom/webgpu/mochitest/test_submit_render_empty.html rename to dom/webgpu/tests/mochitest/test_submit_render_empty.html diff --git a/dom/webgpu/mochitest/test_submit_render_empty.worker.html b/dom/webgpu/tests/mochitest/test_submit_render_empty.worker.html similarity index 100% rename from dom/webgpu/mochitest/test_submit_render_empty.worker.html rename to dom/webgpu/tests/mochitest/test_submit_render_empty.worker.html diff --git a/dom/webgpu/mochitest/test_submit_render_empty.worker.js b/dom/webgpu/tests/mochitest/test_submit_render_empty.worker.js similarity index 100% rename from dom/webgpu/mochitest/test_submit_render_empty.worker.js rename to dom/webgpu/tests/mochitest/test_submit_render_empty.worker.js diff --git a/dom/webgpu/mochitest/worker_wrapper.js b/dom/webgpu/tests/mochitest/worker_wrapper.js similarity index 100% rename from dom/webgpu/mochitest/worker_wrapper.js rename to dom/webgpu/tests/mochitest/worker_wrapper.js diff --git a/dom/webidl/Animation.webidl b/dom/webidl/Animation.webidl index 0f60f3e64ce..401fb951f6d 100644 --- a/dom/webidl/Animation.webidl +++ b/dom/webidl/Animation.webidl @@ -56,7 +56,7 @@ interface Animation : EventTarget { [Throws] undefined reverse(); undefined persist(); - [CEReactions, Throws] + [CEReactions, Throws, UseCounter] undefined commitStyles(); }; diff --git a/dom/workers/test/test_worker_interfaces.js b/dom/workers/test/test_worker_interfaces.js index 7afa12b6659..c85ffac738a 100644 --- a/dom/workers/test/test_worker_interfaces.js +++ b/dom/workers/test/test_worker_interfaces.js @@ -231,85 +231,85 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "FormData", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPU", isEarlyBetaOrEarlier: true }, + { name: "GPU", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapter", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapter", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapterInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapterInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroup", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroup", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroupLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroupLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBufferUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUBufferUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCanvasContext", isEarlyBetaOrEarlier: true }, + { name: "GPUCanvasContext", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUColorWrite", isEarlyBetaOrEarlier: true }, + { name: "GPUColorWrite", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationMessage", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationMessage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePipeline", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDevice", isEarlyBetaOrEarlier: true }, + { name: "GPUDevice", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDeviceLostInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUDeviceLostInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUError", isEarlyBetaOrEarlier: true }, + { name: "GPUError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUExternalTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUExternalTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUInternalError", isEarlyBetaOrEarlier: true }, + { name: "GPUInternalError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUMapMode", isEarlyBetaOrEarlier: true }, + { name: "GPUMapMode", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUOutOfMemoryError", isEarlyBetaOrEarlier: true }, + { name: "GPUOutOfMemoryError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineError", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQuerySet", isEarlyBetaOrEarlier: true }, + { name: "GPUQuerySet", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQueue", isEarlyBetaOrEarlier: true }, + { name: "GPUQueue", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundle", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundle", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundleEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundleEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPipeline", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSampler", isEarlyBetaOrEarlier: true }, + { name: "GPUSampler", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderModule", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderModule", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderStage", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderStage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedFeatures", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedLimits", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedLimits", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureView", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureView", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUUncapturedErrorEvent", isEarlyBetaOrEarlier: true }, + { name: "GPUUncapturedErrorEvent", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUValidationError", isEarlyBetaOrEarlier: true }, + { name: "GPUValidationError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Headers", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! @@ -524,7 +524,7 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "WebTransportSendStream", insecureContext: false }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "WGSLLanguageFeatures", isEarlyBetaOrEarlier: true }, + { name: "WGSLLanguageFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Worker", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/editor/libeditor/HTMLEditSubActionHandler.cpp b/editor/libeditor/HTMLEditSubActionHandler.cpp index 95790fe0679..f55e082449c 100644 --- a/editor/libeditor/HTMLEditSubActionHandler.cpp +++ b/editor/libeditor/HTMLEditSubActionHandler.cpp @@ -1199,6 +1199,10 @@ Result HTMLEditor::HandleInsertText( } InsertTextResult insertEmptyTextResult = insertEmptyTextResultOrError.unwrap(); + // InsertTextWithTransaction() doesn not suggest caret position if it's + // called for IME composition. However, for the safety, let's ignore the + // caret position explicitly. + insertEmptyTextResult.IgnoreCaretPointSuggestion(); nsresult rv = EnsureNoFollowingUnnecessaryLineBreak( insertEmptyTextResult.EndOfInsertedTextRef()); if (NS_FAILED(rv)) { @@ -1236,21 +1240,20 @@ Result HTMLEditor::HandleInsertText( if (MOZ_UNLIKELY(insertPaddingBRElementResultOrError.isErr())) { NS_WARNING( "HTMLEditor::InsertPaddingBRElementIfNeeded(eNoStrip) failed"); - insertEmptyTextResult.IgnoreCaretPointSuggestion(); return insertPaddingBRElementResultOrError.propagateErr(); } insertPaddingBRElementResultOrError.unwrap().IgnoreCaretPointSuggestion(); - rv = insertEmptyTextResult.SuggestCaretPointTo( - *this, {SuggestCaret::OnlyIfHasSuggestion, - SuggestCaret::OnlyIfTransactionsAllowedToDoIt, - SuggestCaret::AndIgnoreTrivialError}); - if (NS_FAILED(rv)) { - NS_WARNING("CaretPoint::SuggestCaretPointTo() failed"); - return Err(rv); + // Then, collapse caret after the empty text inserted position, i.e., + // whether the removed composition string was. + if (AllowsTransactionsToChangeSelection()) { + nsresult rv = CollapseSelectionTo(endOfInsertedText); + if (NS_WARN_IF(rv == NS_ERROR_EDITOR_DESTROYED)) { + return Err(rv); + } + NS_WARNING_ASSERTION( + rv != NS_SUCCESS_EDITOR_BUT_IGNORED_TRIVIAL_ERROR, + "CaretPoint::SuggestCaretPointTo() failed, but ignored"); } - NS_WARNING_ASSERTION( - rv != NS_SUCCESS_EDITOR_BUT_IGNORED_TRIVIAL_ERROR, - "CaretPoint::SuggestCaretPointTo() failed, but ignored"); return EditActionResult::HandledResult(); } diff --git a/gfx/angle/targets/libEGL/moz.build b/gfx/angle/targets/libEGL/moz.build index eb8c0494935..263327b57ce 100644 --- a/gfx/angle/targets/libEGL/moz.build +++ b/gfx/angle/targets/libEGL/moz.build @@ -206,4 +206,4 @@ OS_LIBS += [ DEFFILE = "../../checkout/src/libEGL/libEGL_autogen.def" RCFILE = "../../checkout/src/libEGL/libEGL.rc" -GeckoSharedLibrary("libEGL", linkage=None) +GeckoSharedLibrary("libEGL") diff --git a/gfx/angle/targets/libGLESv2/moz.build b/gfx/angle/targets/libGLESv2/moz.build index 18d296d084a..8d824e8ae57 100644 --- a/gfx/angle/targets/libGLESv2/moz.build +++ b/gfx/angle/targets/libGLESv2/moz.build @@ -425,4 +425,4 @@ OS_LIBS += [ DEFFILE = "../../checkout/src/libGLESv2/libGLESv2_autogen.def" RCFILE = "../../checkout/src/libGLESv2/libGLESv2.rc" -GeckoSharedLibrary("libGLESv2", linkage=None) +GeckoSharedLibrary("libGLESv2") diff --git a/gfx/angle/update-angle.py b/gfx/angle/update-angle.py index 99d65f84f6e..e80f1739b9c 100755 --- a/gfx/angle/update-angle.py +++ b/gfx/angle/update-angle.py @@ -522,7 +522,7 @@ def export_target(target_full_name) -> Set[str]: lib_type = desc["type"] if lib_type == "shared_library": - lines.append(f'GeckoSharedLibrary("{name}", linkage=None)') + lines.append(f'GeckoSharedLibrary("{name}")') elif lib_type == "static_library": lines.append(f'Library("{name}")') else: diff --git a/gfx/layers/AnimationInfo.cpp b/gfx/layers/AnimationInfo.cpp index 427c52b5660..2cb5c4e522a 100644 --- a/gfx/layers/AnimationInfo.cpp +++ b/gfx/layers/AnimationInfo.cpp @@ -513,8 +513,7 @@ void AnimationInfo::AddAnimationForProperty( if (readyTime.IsNull()) { // TODO(emilio): This should generally not happen anymore, can we remove // this SetPendingReadyTime call? - readyTime = aFrame->PresContext()->RefreshDriver()->MostRecentRefresh( - /* aEnsureTimerStarted= */ false); + readyTime = aFrame->PresContext()->RefreshDriver()->MostRecentRefresh(); MOZ_ASSERT(!readyTime.IsNull()); aAnimation->SetPendingReadyTime(readyTime); } diff --git a/gfx/layers/apz/public/CompositorScrollUpdate.h b/gfx/layers/apz/public/CompositorScrollUpdate.h index 249cc7a04e7..0ecf4cfa236 100644 --- a/gfx/layers/apz/public/CompositorScrollUpdate.h +++ b/gfx/layers/apz/public/CompositorScrollUpdate.h @@ -19,6 +19,17 @@ namespace layers { * composition time. */ struct CompositorScrollUpdate { + /** + * The compositor state (scroll offset and zoom level) after the update. + */ + struct Metrics { + CSSPoint mVisualScrollOffset; + CSSToParentLayerScale mZoom; + + bool operator==(const Metrics& aOther) const; + bool operator!=(const Metrics& aOther) const { return !(*this == aOther); } + }; + /** * Describes the source of a CompositorScrollUpdate. * @@ -35,8 +46,7 @@ struct CompositorScrollUpdate { Other }; - CSSPoint mVisualScrollOffset; - CSSToParentLayerScale mZoom; + Metrics mMetrics; Source mSource; bool operator==(const CompositorScrollUpdate& aOther) const; diff --git a/gfx/layers/apz/src/APZCTreeManager.cpp b/gfx/layers/apz/src/APZCTreeManager.cpp index c8b51574263..1ac0eb9f035 100644 --- a/gfx/layers/apz/src/APZCTreeManager.cpp +++ b/gfx/layers/apz/src/APZCTreeManager.cpp @@ -891,7 +891,6 @@ void APZCTreeManager::SampleForWebRender(const Maybe& aVsyncId, aTxn.AddMinimapData(scrollId, minimapData); } -#if defined(MOZ_WIDGET_ANDROID) if (apzc->IsRootContent()) { // Send the root frame metrics to java through the UIController if (RefPtr uiController = @@ -902,7 +901,6 @@ void APZCTreeManager::SampleForWebRender(const Maybe& aVsyncId, } } } -#endif } // Now collect all the async transforms needed for the scrollthumbs. diff --git a/gfx/layers/apz/src/AsyncPanZoomController.cpp b/gfx/layers/apz/src/AsyncPanZoomController.cpp index ccfd5a72e4d..38de6f19260 100644 --- a/gfx/layers/apz/src/AsyncPanZoomController.cpp +++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp @@ -561,6 +561,57 @@ UniquePtr PlatformSpecificStateBase::CreateVelocityTracker( return MakeUnique(aAxis); } +// This is a helper class for populating +// AsyncPanZoomController::mUpdatesSinceLastSample when the visual scroll offset +// or zoom level changes. +// +// The class records the current offset and zoom level in its constructor, and +// again in the destructor, and if they have changed, records a compositor +// scroll update with the Source provided in the constructor. +// +// This allows tracking the source of compositor scroll updates in higher-level +// functions such as AttemptScroll or NotifyLayersUpdated, rather than having +// to propagate the source into lower-level functions such as +// SetVisualScrollOffset. +// +// Note however that there is a limit to how far up the call stack this class +// can be used: mRecursiveMutex must be held for the duration of the object's +// lifetime (and to ensure this, the constructor takes a proof-of-lock +// parameter). This is necessary because otherwise, the class could record +// a change to the scroll offset or zoom made by another thread in between +// construction and destruction, for which the source would be incorrect. +class MOZ_STACK_CLASS AsyncPanZoomController::AutoRecordCompositorScrollUpdate + final { + public: + AutoRecordCompositorScrollUpdate( + AsyncPanZoomController* aApzc, CompositorScrollUpdate::Source aSource, + const RecursiveMutexAutoLock& aProofOfApzcLock) + : mApzc(aApzc), + mProofOfApzcLock(aProofOfApzcLock), + mSource(aSource), + mPreviousMetrics(aApzc->GetCurrentMetricsForCompositorScrollUpdate( + aProofOfApzcLock)) {} + ~AutoRecordCompositorScrollUpdate() { + if (!mApzc->IsRootContent()) { + // Compositor scroll updates are only recorded for the root content APZC. + // This check may need to be relaxed in bug 1861329, if we start to allow + // some subframes to move the dynamic toolbar. + return; + } + CompositorScrollUpdate::Metrics newMetrics = + mApzc->GetCurrentMetricsForCompositorScrollUpdate(mProofOfApzcLock); + if (newMetrics != mPreviousMetrics) { + mApzc->mUpdatesSinceLastSample.push_back({newMetrics, mSource}); + } + } + + private: + AsyncPanZoomController* mApzc; + const RecursiveMutexAutoLock& mProofOfApzcLock; + CompositorScrollUpdate::Source mSource; + CompositorScrollUpdate::Metrics mPreviousMetrics; +}; + SampleTime AsyncPanZoomController::GetFrameTime() const { APZCTreeManager* treeManagerLocal = GetApzcTreeManager(); return treeManagerLocal ? treeManagerLocal->GetFrameTime() @@ -1687,6 +1738,10 @@ nsEventStatus AsyncPanZoomController::OnScale(const PinchGestureInput& aEvent) { { RecursiveMutexAutoLock lock(mRecursiveMutex); + + AutoRecordCompositorScrollUpdate csu( + this, CompositorScrollUpdate::Source::UserInteraction, lock); + // Only the root APZC is zoomable, and the root APZC is not allowed to have // different x and y scales. If it did, the calculations in this function // would have to be adjusted (as e.g. it would no longer be valid to take @@ -3772,6 +3827,9 @@ bool AsyncPanZoomController::AttemptScroll( ParentLayerPoint adjustedDisplacement; if (scrollThisApzc) { RecursiveMutexAutoLock lock(mRecursiveMutex); + AutoRecordCompositorScrollUpdate csu( + this, CompositorScrollUpdate::Source::UserInteraction, lock); + bool respectDisregardedDirections = ScrollSourceRespectsDisregardedDirections( aOverscrollHandoffState.mScrollSource); @@ -4916,6 +4974,12 @@ bool AsyncPanZoomController::UpdateAnimation( } if (mAnimation) { + AutoRecordCompositorScrollUpdate csu( + this, + mAnimation->WasTriggeredByScript() + ? CompositorScrollUpdate::Source::Other + : CompositorScrollUpdate::Source::UserInteraction, + aProofOfLock); bool continueAnimation = mAnimation->Sample(Metrics(), sampleTimeDelta); bool wantsRepaints = mAnimation->WantsRepaints(); *aOutDeferredTasks = mAnimation->TakeDeferredTasks(); @@ -5233,8 +5297,10 @@ bool AsyncPanZoomController::SampleCompositedAsyncTransform( const RecursiveMutexAutoLock& aProofOfLock) { MOZ_ASSERT(mSampledState.size() <= 2); bool sampleChanged = (mSampledState.back() != SampledAPZCState(Metrics())); - mSampledState.emplace_back(Metrics(), std::move(mScrollPayload), - mScrollGeneration); + mSampledState.emplace_back( + Metrics(), std::move(mScrollPayload), mScrollGeneration, + // Will consume mUpdatesSinceLastSample and leave it empty + std::move(mUpdatesSinceLastSample)); return sampleChanged; } @@ -5246,7 +5312,10 @@ void AsyncPanZoomController::ResampleCompositedAsyncTransform( if (APZCTreeManager* treeManagerLocal = GetApzcTreeManager()) { mScrollGeneration = treeManagerLocal->NewAPZScrollGeneration(); } - mSampledState.front() = SampledAPZCState(Metrics(), {}, mScrollGeneration); + mSampledState.front() = SampledAPZCState( + Metrics(), {}, mScrollGeneration, + // Will consume mUpdatesSinceLastSample and leave it empty + std::move(mUpdatesSinceLastSample)); } void AsyncPanZoomController::ApplyAsyncTestAttributes( @@ -5499,6 +5568,12 @@ void AsyncPanZoomController::NotifyLayersUpdated( return; } + // FIXME: CompositorScrollUpdate::Source::Other is not accurate for every + // change made by NotifyLayersUpdated. We may need to track different + // sources for different ScrollPositionUpdates. + AutoRecordCompositorScrollUpdate updater( + this, CompositorScrollUpdate::Source::Other, lock); + // If the Metrics scroll offset is different from the last scroll offset // that the main-thread sent us, then we know that the user has been doing // something that triggers a scroll. This check is the APZ equivalent of the @@ -6092,37 +6167,34 @@ const FrameMetrics& AsyncPanZoomController::Metrics() const { return mScrollMetadata.GetMetrics(); } -bool CompositorScrollUpdate::operator==( - const CompositorScrollUpdate& aOther) const { - // Consider two updates to be the same if the scroll offsets are the same +bool CompositorScrollUpdate::Metrics::operator==(const Metrics& aOther) const { + // Consider two metrcs to be the same if the scroll offsets are the same // when rounded to the nearest screen pixel. This avoids spurious updates // due to small rounding errors, which consumers do not care about because // if the scroll offset does not change in screen pixels, what is composited // should not change either. return RoundedToInt(mVisualScrollOffset * mZoom) == RoundedToInt(aOther.mVisualScrollOffset * aOther.mZoom) && - mZoom == aOther.mZoom && mSource == aOther.mSource; + mZoom == aOther.mZoom; +} + +bool CompositorScrollUpdate::operator==( + const CompositorScrollUpdate& aOther) const { + return mMetrics == aOther.mMetrics && mSource == aOther.mSource; } -#ifdef MOZ_WIDGET_ANDROID std::vector AsyncPanZoomController::GetCompositorScrollUpdates() { RecursiveMutexAutoLock lock(mRecursiveMutex); MOZ_ASSERT(Metrics().IsRootContent()); - - // FIXME(bug 1940581): Propagate an accurate source. - CompositorScrollUpdate current{ - GetEffectiveScrollOffset(eForCompositing, lock), - GetEffectiveZoom(eForCompositing, lock), - CompositorScrollUpdate::Source::UserInteraction}; - if (current != mLastCompositorScrollUpdate) { - mLastCompositorScrollUpdate = current; - return {current}; - } - - return {}; + return mSampledState[0].Updates(); +} + +CompositorScrollUpdate::Metrics +AsyncPanZoomController::GetCurrentMetricsForCompositorScrollUpdate( + const RecursiveMutexAutoLock& aProofOfApzcLock) const { + return {Metrics().GetVisualScrollOffset(), Metrics().GetZoom()}; } -#endif // defined(MOZ_WIDGET_ANDROID) wr::MinimapData AsyncPanZoomController::GetMinimapData() const { RecursiveMutexAutoLock lock(mRecursiveMutex); diff --git a/gfx/layers/apz/src/AsyncPanZoomController.h b/gfx/layers/apz/src/AsyncPanZoomController.h index 390b70f5484..d192b18992a 100644 --- a/gfx/layers/apz/src/AsyncPanZoomController.h +++ b/gfx/layers/apz/src/AsyncPanZoomController.h @@ -592,7 +592,7 @@ class AsyncPanZoomController { const FrameMetrics& Metrics() const; FrameMetrics& Metrics(); -#ifdef MOZ_WIDGET_ANDROID + class AutoRecordCompositorScrollUpdate; /** * Get the CompositorScrollUpdates to be sent to consumers for the current * composite. @@ -600,9 +600,13 @@ class AsyncPanZoomController { std::vector GetCompositorScrollUpdates(); private: - // Last CompositorScrollUpdate sent to GeckoView through UIController. - CompositorScrollUpdate mLastCompositorScrollUpdate; -#endif // defined(MOZ_WIDGET_ANDROID) + // Compositor scroll updates since the last time + // SampleCompositedAsyncTransform() was called. + // Access to this field should be protected by mRecursiveMutex. + std::vector mUpdatesSinceLastSample; + + CompositorScrollUpdate::Metrics GetCurrentMetricsForCompositorScrollUpdate( + const RecursiveMutexAutoLock& aProofOfApzcLock) const; public: wr::MinimapData GetMinimapData() const; diff --git a/gfx/layers/apz/src/SampledAPZCState.cpp b/gfx/layers/apz/src/SampledAPZCState.cpp index 8cdd905aba2..a95dd67acd2 100644 --- a/gfx/layers/apz/src/SampledAPZCState.cpp +++ b/gfx/layers/apz/src/SampledAPZCState.cpp @@ -19,20 +19,27 @@ SampledAPZCState::SampledAPZCState(const FrameMetrics& aMetrics) RemoveFractionalAsyncDelta(); } -SampledAPZCState::SampledAPZCState(const FrameMetrics& aMetrics, - Maybe&& aPayload, - APZScrollGeneration aGeneration) +SampledAPZCState::SampledAPZCState( + const FrameMetrics& aMetrics, Maybe&& aPayload, + APZScrollGeneration aGeneration, + std::vector&& aUpdates) : mLayoutViewport(aMetrics.GetLayoutViewport()), mVisualScrollOffset(aMetrics.GetVisualScrollOffset()), mZoom(aMetrics.GetZoom()), mScrollPayload(std::move(aPayload)), - mGeneration(aGeneration) { + mGeneration(aGeneration), + mUpdates(std::move(aUpdates)) { RemoveFractionalAsyncDelta(); } bool SampledAPZCState::operator==(const SampledAPZCState& aOther) const { // The payload doesn't factor into equality, that just comes along for // the ride. + // The compositor scroll updates also do not factor into equality. + // We can think of those as not describing the current state, but the + // process by which we got from the previous state to this one. + // The FrameMetrics constructor of SampledAPZCState does not initialize + // mUpdates, so we can't rely on them always being present. return mLayoutViewport.IsEqualEdges(aOther.mLayoutViewport) && mVisualScrollOffset == aOther.mVisualScrollOffset && mZoom == aOther.mZoom; diff --git a/gfx/layers/apz/src/SampledAPZCState.h b/gfx/layers/apz/src/SampledAPZCState.h index a521eeaf879..572575887ba 100644 --- a/gfx/layers/apz/src/SampledAPZCState.h +++ b/gfx/layers/apz/src/SampledAPZCState.h @@ -10,6 +10,7 @@ #include "FrameMetrics.h" #include "mozilla/Maybe.h" #include "mozilla/ScrollGeneration.h" +#include "mozilla/layers/CompositorScrollUpdate.h" namespace mozilla { namespace layers { @@ -20,7 +21,8 @@ class SampledAPZCState { explicit SampledAPZCState(const FrameMetrics& aMetrics); SampledAPZCState(const FrameMetrics& aMetrics, Maybe&& aPayload, - APZScrollGeneration aGeneration); + APZScrollGeneration aGeneration, + std::vector&& aUpdates); bool operator==(const SampledAPZCState& aOther) const; bool operator!=(const SampledAPZCState& aOther) const; @@ -30,6 +32,7 @@ class SampledAPZCState { CSSToParentLayerScale GetZoom() const { return mZoom; } Maybe TakeScrollPayload(); const APZScrollGeneration& Generation() const { return mGeneration; } + const std::vector Updates() const { return mUpdates; } void UpdateScrollProperties(const FrameMetrics& aMetrics); void UpdateScrollPropertiesWithRelativeDelta(const FrameMetrics& aMetrics, @@ -58,6 +61,8 @@ class SampledAPZCState { // An optional payload that rides along with the sampled state. Maybe mScrollPayload; APZScrollGeneration mGeneration; + // Compositor scroll updates since the last sample. + std::vector mUpdates; void RemoveFractionalAsyncDelta(); // A handy wrapper to call diff --git a/gfx/layers/ipc/LayersMessageUtils.h b/gfx/layers/ipc/LayersMessageUtils.h index 5c245d443b6..96a16cb722f 100644 --- a/gfx/layers/ipc/LayersMessageUtils.h +++ b/gfx/layers/ipc/LayersMessageUtils.h @@ -1188,18 +1188,31 @@ struct ParamTraits mozilla::layers::CompositorScrollUpdate::Source::Other> {}; template <> -struct ParamTraits { - typedef mozilla::layers::CompositorScrollUpdate paramType; +struct ParamTraits { + typedef mozilla::layers::CompositorScrollUpdate::Metrics paramType; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.mVisualScrollOffset); WriteParam(aWriter, aParam.mZoom); - WriteParam(aWriter, aParam.mSource); } static bool Read(MessageReader* aReader, paramType* aResult) { return (ReadParam(aReader, &aResult->mVisualScrollOffset) && - ReadParam(aReader, &aResult->mZoom) && + ReadParam(aReader, &aResult->mZoom)); + } +}; + +template <> +struct ParamTraits { + typedef mozilla::layers::CompositorScrollUpdate paramType; + + static void Write(MessageWriter* aWriter, const paramType& aParam) { + WriteParam(aWriter, aParam.mMetrics); + WriteParam(aWriter, aParam.mSource); + } + + static bool Read(MessageReader* aReader, paramType* aResult) { + return (ReadParam(aReader, &aResult->mMetrics) && ReadParam(aReader, &aResult->mSource)); } }; diff --git a/gfx/layers/ipc/UiCompositorControllerChild.cpp b/gfx/layers/ipc/UiCompositorControllerChild.cpp index 15ea55dda82..b0363665422 100644 --- a/gfx/layers/ipc/UiCompositorControllerChild.cpp +++ b/gfx/layers/ipc/UiCompositorControllerChild.cpp @@ -230,11 +230,9 @@ UiCompositorControllerChild::RecvToolbarAnimatorMessageFromCompositor( mozilla::ipc::IPCResult UiCompositorControllerChild::RecvNotifyCompositorScrollUpdate( const CompositorScrollUpdate& aUpdate) { -#if defined(MOZ_WIDGET_ANDROID) if (mWidget) { mWidget->NotifyCompositorScrollUpdate(aUpdate); } -#endif // defined(MOZ_WIDGET_ANDROID) return IPC_OK(); } diff --git a/gfx/layers/ipc/UiCompositorControllerParent.cpp b/gfx/layers/ipc/UiCompositorControllerParent.cpp index b06848e6dcc..8a5e0ffb3cc 100644 --- a/gfx/layers/ipc/UiCompositorControllerParent.cpp +++ b/gfx/layers/ipc/UiCompositorControllerParent.cpp @@ -207,12 +207,10 @@ void UiCompositorControllerParent::NotifyFirstPaint() { void UiCompositorControllerParent::NotifyCompositorScrollUpdate( const CompositorScrollUpdate& aUpdate) { -#if defined(MOZ_WIDGET_ANDROID) CompositorThread()->Dispatch(NewRunnableMethod( "UiCompositorControllerParent::SendNotifyCompositorScrollUpdate", this, &UiCompositorControllerParent::SendNotifyCompositorScrollUpdate, aUpdate)); -#endif } UiCompositorControllerParent::UiCompositorControllerParent( diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index f40a4b08d39..daf108e6611 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -3203,10 +3203,10 @@ void gfxPlatform::InitWebGPUConfig() { feature.Disable(FeatureStatus::Blocklisted, message.get(), failureId); } -#ifdef RELEASE_OR_BETA +#if !(defined(NIGHTLY_BUILD) || (defined(XP_WIN) && defined(EARLY_BETA_OR_EARLIER))) feature.ForceDisable(FeatureStatus::Blocked, - "WebGPU cannot be enabled in release or beta", - "WEBGPU_DISABLE_RELEASE_OR_BETA"_ns); + "WebGPU cannot be enabled unless in Nightly, or Early Beta on Windows.", + "WEBGPU_DISABLE_RELEASE_OR_NON_WINDOWS_EARLY_BETA"_ns); #endif gfxVars::SetAllowWebGPU(feature.IsEnabled()); diff --git a/gfx/wr/Cargo.lock b/gfx/wr/Cargo.lock index 5a6906fe77c..811c44d0ad1 100644 --- a/gfx/wr/Cargo.lock +++ b/gfx/wr/Cargo.lock @@ -982,9 +982,9 @@ dependencies = [ [[package]] name = "glean" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251b9cb685554b96dcf785dba69ce90447006dd6d9229db783336c981c3777e1" +checksum = "95024f4707705270208e36983976cbac235dd7fc33c9f1cb0dee396ec1ce295d" dependencies = [ "crossbeam-channel", "glean-core", @@ -996,9 +996,9 @@ dependencies = [ [[package]] name = "glean-core" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49d1d62648ddeed8cb996373046ea45de93f1d1ff956aba054b9304bc305753" +checksum = "5ca0df94fb37669287b77e8aa300913ad1d14426d7f9e443b0ce1185349c817e" dependencies = [ "android_logger", "bincode", diff --git a/gfx/wr/Cargo.toml b/gfx/wr/Cargo.toml index f3a710877f2..dbb574a052b 100644 --- a/gfx/wr/Cargo.toml +++ b/gfx/wr/Cargo.toml @@ -9,7 +9,7 @@ members = [ resolver = "2" [workspace.dependencies] -glean = "=64.0.1" +glean = "=64.1.1" [profile.release] debug = true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 17925ec362b..ffc4b69626c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] # AGP -android-gradle-plugin = "8.9.1" # Keep lint version in sync -lint = "31.9.1" +android-gradle-plugin = "8.9.2" # Keep lint version in sync +lint = "31.9.2" python-envs-plugin = "0.0.31" maven-ant-tasks = "2.1.3" @@ -81,7 +81,7 @@ serialization = "1.8.1" # Mozilla versions apilint = "0.5.4" -mozilla-glean = "64.0.1" +mozilla-glean = "64.1.1" # Testing versions androidx-test = "1.6.1" @@ -101,7 +101,7 @@ adjust = "5.3.0" sentry = "8.8.0" commons-exec = "1.3" -spotless = "6.25.0" +spotless = "7.0.2" tomlj = "1.1.0" [libraries] diff --git a/image/test/reftest/color-management/reftest.list b/image/test/reftest/color-management/reftest.list index 0c758bc2cb4..1b8606ec842 100644 --- a/image/test/reftest/color-management/reftest.list +++ b/image/test/reftest/color-management/reftest.list @@ -7,4 +7,4 @@ == trc-type.html trc-type-ref.html # Bug 1560617 # test for bug 1951423, bt709/bt601/bt2020/bt1886 fuzzy(0-4,0-182740) == 720p-CCWH.png 720p-CCWH_yuv444p_pc-1-13-6.avif -fuzzy(0-16,0-268977) == 720p-CCWH.png 720p-CCWH_yuv444p_tv-1-1-1.avif +fuzzy(0-16,0-282508) == 720p-CCWH.png 720p-CCWH_yuv444p_tv-1-1-1.avif diff --git a/image/test/reftest/downscaling/reftest.list b/image/test/reftest/downscaling/reftest.list index 6b63752f1ae..8952e69193b 100644 --- a/image/test/reftest/downscaling/reftest.list +++ b/image/test/reftest/downscaling/reftest.list @@ -111,7 +111,7 @@ fuzzy(0-1,0-1024) == downscale-32px.html?.jpg downscale-32px-ref.html fuzzy(0-1,0-50) == downscale-orient.html downscale-orient-ref.html # be careful changing fuzzy, the bug this test is testing is if the shade of orange is too dark -fuzzy(0-1,0-144) == 1919368-1.html 1919368-1-ref.html +fuzzy(0-1,0-164) == 1919368-1.html 1919368-1-ref.html @@ -219,7 +219,7 @@ fuzzy(0-4,0-18) == downscale-orient.html downscale-orient-ref.html == huge-1.html?32768x100.jpg,32768,100 huge-1.html?100x100.jpg,32768,100 # be careful changing fuzzy, the bug this test is testing is if the shade of orange is too dark -fuzzy(0-1,0-144) == 1919368-1.html 1919368-1-ref.html +fuzzy(0-1,0-164) == 1919368-1.html 1919368-1-ref.html # Only need to run these with downscaling on != 1421191-1.html about:blank diff --git a/intl/tzdata/GIT-INFO b/intl/tzdata/GIT-INFO index 51179cc0383..e4881798277 100644 --- a/intl/tzdata/GIT-INFO +++ b/intl/tzdata/GIT-INFO @@ -1,5 +1,5 @@ -commit 22428453df80492b31f32da309410d23a23c32b6 -Author: Almaz Mingaleev -Date: Thu Jan 30 19:06:01 2025 +0000 +commit d6a3a85e988251a7e4966035e618c6d203f1bb7c +Author: Almaz +Date: Fri Apr 11 18:26:16 2025 +0100 - ICU-23022 Update ICU data to TZDB 2025a. + ICU-23096 Update ICU data to TZDB 2025b. (#45) diff --git a/intl/tzdata/VERSION b/intl/tzdata/VERSION index 0846b7f265f..ef468adcecf 100644 --- a/intl/tzdata/VERSION +++ b/intl/tzdata/VERSION @@ -1 +1 @@ -2025a +2025b diff --git a/intl/tzdata/source/be/metaZones.res b/intl/tzdata/source/be/metaZones.res index 80ae1508b95942ec72b42850ac86044b0f4183d9..7b1076b17c29e0c3f3fcb439b86e39c52bd031de 100644 GIT binary patch delta 9741 zcmZ9S33yc1*~ibFjjWT&WHS3ccV-}&HSGH$jX(ucRAdt)AVS2*CVMj>EMlY>a}^QU zL{yB3tdXLi1q2ERh(Li-wjxpx8k8a*qW%8w@b-E7efs>)|2^+H=iYPw@3}Ydg!6|~ z>kq5y0o;^;k(crOw9!wE8UMo5n~vvwZju@lMebGj zfEX>th_T{n%ta^(Ks#?r8T@?vW;f`5@=;~U^W8h%Y&P6g;5y{H znRCP?=bUdg&Ue;T>v}8K;Me$z0_Cz*j`_=SyLq3ZHU5vO&8?=^)ufombu1V{v91rb zs@v51uP7tOwNv@>l;z_r!Jd?ow^FOULalEswbDsyGoPi_^Q3ZmT(NXb(Ty)oy`vlG z4rGLK*Q=LnH+Z)+JL(?L?1uLDZb@CAVa={{KjUr{nD2enyH|4~Yj<`XnXGzX zJx)DQJy|`?ZFK)eyIR{@vp4sPW{v7DWP@7K*7|p*qjz)5bH~wLUFWFP%%e7EJ+X`5B&Be-`31VT_4Rh-HFUEb)9tEyaoQHIo&kJ)Fm{}(}LRUBh;#YqBiShI)5OY zPhUN-o8rK3#XZ3%Em68nc3Et_F|mVJR;N2EYPA{Ess~W(y_U{DuI!!| zu%*(Y>B?zOQ=FOJqW72jNtS}NFLHV(_v_{xq!dkx2YobAvy$4}v=2HX#qO7=mFlVW zTa>CvErNffSo0CJnd#lC8!7e;O6N7y`bQ`SCq<>NmAjLkl8Tj~FT|ym%7Pc(PkksE z+!y2(?!)fwsvg;cRDH#Z;-q9#{hZg?e^c^j?-K#hI)8>{qSQ*{36tZG@~+H@Dzn&^ zF*aj{JUHVMsk3IGZdCS4Pcr+YT%En%Gh3?iXw~0}tjv+w-7@|mz3u){w2&rwUe~nq zScFY|TvUq(eWe+9d@WVNE#jFqhQrc&(O2`EfKHWE@5}El6=y%=c_4p*XQOgta>v|S z?a$f^qN8eHW>B84Sf>OscWbs}eysk~H%#d{rMuKunKxyK)OXXxDUVAnKFs?d?|@KC z6?q5r^M%^|p?<#pP3r64)aR#F+|Mh+r-f7hHQUgGW*d4K9-&!=NB%S0^f2X351aN- z-n7SjociYDmLlp~ivIsP%WWFB+_qY2+-m*Lb@H}RKkxc~c4gTp)Jn$mFQpHaL(|7t z)FPl4&K*M1`%y2vvywrmJzAx7#ss@Zs~3(6EU$7@q%UXC3sW|Rzu9zj#$lBdP*zn< zL2FNiGf(M7K@NsyD}7QkQrq>y+Cr%FI$K*?uQ(0)BU!NK|*6^3`JAemp$>_u$peppV#Ap;jHx z3(GE{_LVC2)m^){%=776A}jPQ$qQAbUg!@(|Dr#b2g`gd^9=tzF74Kf!iZ37o-B;e zd|yk&IP2jkOi_QT7d9RAxJ_qUL4Df_nju=~g}E=Zueq<~81V-9-s3%H^84RH~R~dooM&4ECAnyLXvAF}K>ZgclD(>!P?WZdo6bR8poClln@-tYiHe>s0G(sZyFNy&}CWeIRX;epMM%EmR#JBUBZt@v3R6YSl|A>yOS=mP*yD{%i8 zs!sVIR9#YiuO6tLsa~XB8^gPLz_7i>+MQ<_VfpR`%plqryHw`uJGyH?i5 zw5_zAT<_Z-vzKdoYs-AQ10A)4e8()GYb&(VJZH2ufuY)3ZJlWV2Wv~cAI^p zeV6?!?Y_Vo?bq6i+H2Y-?LA#ipfRx5e%s;p-Ll+v^!Ijfl) zsE`=}o*;xL2zh`X1VM993}PS&T7fBGKKKKu2d{(0;4QEmybX4MKY`s~FW3*hQqI?U zQrKn)+YDiwp&!7%0B!HzWg@HsT95&+37yt%=q2Ng{96YV8eA$wkhG-^8ff_Iu;Gx4W15_!DDuq#{ zFsc+rmBP!wO7ISN4}1XDf{(#Qumx-dp8}W@hB;xF6NWiqm=pdA90A{e6J;V5K84^6 zI0r6*Z^0FC4cq`X!7cC;xC?$M6U_xs10Bc&IUo-hK_RdL2XF%)kUsdFlZidpLMzD=@J6OM9-O0KeN;ljC_Jc#5Kg#)I$ejeKGdysf6@R@- zTXc!_GV2xAtE}I%-e7HF{ekrs>uuIMP}=-m@az3tkxIaS)T2nl2_0(&YZhw`6i-v6 z2S#8z&nu7>P@K`IZe=*ew z8!2uFg{8$EKo`)17ndUL1NwpfJa+&Tb{7u>R3chm&N`fR6zgc#3Mj1^3&y46lqkmg zUObftW+JXeOc$HOI*)ZeYb}&Exd7CG*EqizN*70Mips@~tOr^7oi0AYeLfS#$Iz!6oB*f6S?*s%d>LFtpGtBAq<%ni z8{9>bcK>Ugh^P?5fr#$@!bk?<9AMzS39%J8d7c-FwGlrE@th*WF;K#DsKhh}uVSPV z&%x`Miu6RH7Y{y!xQrL@>lmRr(`E*;4u<0CB11tr7|D6Aaiju$d>bNT0Y2vuls7UJ zptO-{z-5ixFK0?bYWV^SSQoO^LFq<#ZzGGq67=Z_mIJCQjiH{A2Cxo&SQ^3W8)*b6 zWn>3(v~emYt=kQ_lo2jrp6X;4|efpz(H^X90Mou{zuP%^WYM=0>0-9HnIM|dW)56OEW9VqE8#hWk`+%#CHRX0cN3;b<(SM`HwB>loKKh8oBGfNG4g#EJmw8be)U zZ8(S8#=3wWpcFZ5Ce{b^gE@!N#>zP!iTcN=wlrZZYb6ij-HlD++*DSo zHSKyPz`Goy+ERZ$SODmirE5_cX)}ufm5k=B1gim+iRP?L&q;~cI&?O2vN4?$v2DoF z`%4$u3HI>#e%6DmhgkXbjUDCwG1e2TC!ut$)8H)UE<)9)e++exq3*Hod4TFplYaoW zIYy0RT;n*^7~^r2CC+t?=iFZ#*RvW}jjSdpT!@>29k@B4@^c_V>4G7ETF2pKyoATv zK)#AO^mig+Mmd<){Jcf1^o1f#)NX$gNH1QX;;d2RE{AhLTl{ zU>l%wKs(;ax|@~G1l?dCILI;H>-aImwEiT(s~ta&KCQpRdYSbKDe51;%8Bn;Z?HD8 z{=j;RmCgiR@DA%;)_bgcP7>(Syab<@1YAwGC3MJt4oPQEdoABiF%&+8gh#f(=O=)Lb{xF zB`X~&+Q@2v1C>|{*7MkAD9%6vXDER)l-R*}K0^sULy0~7^FOf<6Ud4E;1Ewf3Z)z1 z2SoyhDS^Y3IL~8zm=b)L5?7GN>z4Q)G=W>-4&XD9#4tTXlFkCD28#P7Q#v$RoaD2R zHd$97ENS1P+&IaAM59>p$Wvu;KA7vfDIxwv%ksQp4p-{497#PkuI!tu&(L9Dj zm8|3#2P;Vji^iw3&g3zCxRN!To5wnz$8g?~3prQM^-sRWiAAh*_-Hdr03W>MDjr+S z`X1{V)&?l8!9h&&K}>Guu}0RdtlL<#KjUDBv{I>Awk5SM?_}P0c|RF)3=TuW(ADs; zq1-UuP-9qRXfS+cIAl0$Xv$aT7vzWX+vWGkACx~Pe`@~A`786c=6{oa-KaLYjIE7* zjDw70jMI!S8W$Ni8ox9iGhQ(Mt01GmT@WqkT<}oA(1Pa+W);*ItSZ=Cu&dxi!PSDF zP1z=wDPejbW$JGlVH#(uHZ3)6HT}i(o#}RAW}&SxQCM0yxUjNtcH!c}_X`^f_ZFTm zyjFP6Y&6T}_T~r8PnavsDRZ59m3fQ#fcc#Hy7?DNuEk}ETY6X?v5c@xvdp!tuxz&M zv7EA8v;1n!vwE#1)>3Pkb*S|j>qKjnwbr`Wy4srBVBKNeXFYDcV7+0zYs;_|*u1uw zt-b95TR+=S+q1S8Y_n{2wk5XrZJTX7ZC~5Y*sj^`*mZW3J!o%h?`bcy53!H7Pqx?C z7uw&le`Mcb-)BE+zi7Yd5RPnz&C%S^+R@$7*D=IV;dsF@+fna$*RjFzx#OVYq~lvh zQ_3khbDa)nk+Y+-mve}7v~#NSCFh&YkDS|`hnyFjcU;*nrz`I2;Tq@~6z(S=vnIdz_ZP>*K^$Sch5gPse9gBufrSmw)A%QKH?qWo#370t@p0*uJ?ZK z{mOgRd(C^-m*KPcn)}-LdiwhNM)@ZB=KAV=D}5V$+kId8&ibzV?)fwQc7NR8)!)xQ z)L-eZ^1tj~>R;#I;Xmp>=WhzA1IBztpe4c2FwBTzf*oKd_!1ld$H8gvH*l_6qyiTZ{2g2dSHM;9J-7jyzz^USxDD=sU#o?z z1{aV zAPic72#5h#A1nc_KpWIQ*bV`#4|WD!0nTv{RtI5q5LO3abr4nuhk);L4Klm1c72s{K8ms}ZJopj7i4MZ<;1=)+ z_#=Sj!R-LH2mb_i0i5pOKCmAg0!ILB51s(9J@{7u+k@x81pw=V--3Un&|Cx80c;P# z_TW$8X8_AX62M6hWrAz~+e5HD1lvQfJ!A#2KI8;$-~%!U0oWcY22l_PEkSG07PJSQ zfYenP`EI}m!$UAU1j9oxJTwG60iFa;ff34@cReZC8=4HJg6Uu;fYqUDfRi19-Jur& z><+>15bO@&yAgujp+(>=upGPt-UA;3xExv!;Bsg)XarjU91g+Z5Zn#H-O%1@Q5yO) zf&%~+hhTB&IQR=V1z>Rq)`nnh2-b$a16KhKcIXCZ0&qBVOIh&VgGomd zAPB+$zJ=jiI0h1+1hlSy-|=)Qf?l8xcnI_ZIIdy17lwObxEF?dVYn9_25?-%IIiK5 lU=$cFG{URfmbpuQqM^Zyf6|3t)kM7_Tu~;HUo`N4{|nryy?y`y delta 9624 zcmYk?3!IJB`oQt`-M5)Bw>{T=zrTC$X7-+$JtTxs$I&FB5-LTC$o+CAQG0}>lBxag zDoN?49BGn7gp?CPa*#+a-EU4LN&SCod(P)`>hoRCTI;>7_j%U4tB+pWZaValsX5~N zK-07wP0RCXTGdDA=nI+CH7)e#@~#VuTaFj6D9^lP^r&di#%MQdBeWqLzC^o~-YD&s z7E3hLp{2(SUG1SH7qvFc)N-}fT3_vIt-p4yHb@(+4b5rqU0cv6@N?#+F;U<2+&+=} zz1t(3^FC>{OI=Zr(#%}(y0#+xSLWL>p-6ebVB6-<|JjZP4(3$nTwTzVz3<1WZFRY7 zgRxBQ*hrW8p|^wWBSRw{BW1ioYyBeKt9R4?ruWb<^Yw2vr7&eQ7HX{mt?t!K9QC%U z^%?3(oONC#9vqWt9@`=3fV!WtKC@$Nw~mK$Zt|IY?}QE&?C_Np9LgCN+UA?$yRXn5 z`X%g&Tw&xGzHpbquEFcoHQ}dKTbNy&@AJ&%<2sgIrea1E*JJovrsam5=wtZ2x)~{6?x=ywFUe)H^rrJR7jD37U-Gr!q?jXx4;3^oPd%ruX8b=3XmTNhg!EFToUoAajm zB9#Pl#(H0PdA9d_;o!n?>IuG&RBO3MwFR%K);~ORbbPeu?V%U*-n3n2dE55yyiK-F zwzq?(@cji{EuWZMtFr=5)#mR|t@)H{TOH5Nznz`W-aFEw`jM8*)e}PcoXkHa%ujDs zGnSHU>sM_-_RR2msvrJNwWjPwGH+DQD`RBdFTYK`pT&J{3pX=d=GI^CXWp5!RJT^-dQR&Cgp zd1F$Q{!->3^Ovd_izPdMWyUnQMqignO&+4VG7nF#(?gjJlV40fsoVWKj0gQ|{jZuX z&L3#%rOnp%>Mqln;?ChidN_ZxR;9HqnQED+pRW~b<(^f>>v(n_@|Kxbhk9l1XzZqU%B*R;PVdy>yuH6(@?`PL#alG9KC*aA(Y>14 z|750VibH=g^Z1nb{~ohnoISQUS67t3U%6Y&R_=CGtFfc{+*$UE?N_O> z{VK<=*{hs)1h`}SJGRhTrj97qi^AlXk4d+4{6uEv)Cq3?i6YH2lFRP$j4Uc4+KaUE ze9au#&|;sq-K1A#4&BvAJ0Km;+gzlT6>w-m=HB$w^s7ahvr01;cXn1eFXVo&IxloC z&yJTnH)O{fTpz2k>tlDN8oMjq4QlLea4*Y_m$~1~j^B0f%#L@u4`;`RJr*_gSUeSK z?5Xg?vg4SiU3T2gGf*@4=7fQ)Sof^bbmMhR_p{Rji!|MIP$hw-PT(i5s%%0@O4CDA zIPXJVp1%WpiMgZby``B=TZ%NtM$H^*o7vISMGt4}(*v}rY};r06?!D|%ydslq)4mm z#oc;U_HukejAXV>kL!msC#Lte+PLG)OrN_O8E?M3i!WRpDr&=>wW2m^b^0Whewfw# zPU37CV@6$7+hY6woMG0#FVc#(YUbQei?$Y1m=MR^(}>~Bv>6i%$Cj^9_t9M0=l(IH zhu$mmx0&tw9^x%lo}=E%7@=C8$8W2D$GL1|BYopR8Lwq6Ym2nfGnzSkvh<9)ugaRA zUkd-)%+{G3^@dFItciLgX+CXpHfV_(WgFOp!-ZS50-KwqCYP1Wqi?v}| zv-T{hKdk+rop4^FoAf-rR_~?X;Jh~UALlUVczujMOP{AN(qGnF^gm5@QSz;p>Wi+!1P>bMCcCF%cj>&D@|)0qfHwece%Qm zwwm^Z+nSD=zBdmrPcuJieknZ3yxhFbyxq4q{BU@&_n`T#{S!-}#bK$kbPR8{^eX9U z>F1i{nqj%cGR891a=&GPWtnBY<$c#&%T~)S*LK%I%Rb9d%PDIsYk4?*+MQ!{M{=!( zwbpvRwUh4=_a*M$)&^^z(Cd*Z>%hy*HU*1IE@S?{wpTc5TrjSPs~Qa;T3 zw)+|Pa`$TM=E$Sgoz}zF@2o#t|F9KA7DraNk9rD1haE>fU4!R&dfU9Vu&u`P4_kZh zURzgNgX2`>chBRtt38X;p4V+R+J+m|w$Zjpw&}KeZSy=QY>(NVwJq`bLIqBj(a!jr zx7ORy+uQcWk|ljK<1>7Y!}z6-7R^OIN>PO*>d+c((H;#LfI+w!!!Z)0`=qt#I68Nt z2{UjH=HM-?##*e$d-wn!VjFf~7ygZXU|~@f7G+`4WB3~1;b*9Y{)*H11Aq0=VkTJA zG`vBKH;5IX1m$qR4IhGtU>F)P4bw3bvvD8hq8Ur^8d~rsR$&d+VFNZ{Gq!*ih-J#| zccxio>_;5O37o?3INL{yYcRuxJQSc9q&r>#Cp_>Y1OstYqXsFo!3F4mPUwP*(H)oe z(bDmrbb6yNu10@c3+fdgjG?#{w_yy%V-mmQIOU5|zBuKJQ@;2En1_e)2p-3L zJdH(Ij2E$lJrE~tancqiZE?~TCv9=k7AI|S(iSIeancqiZSjw=6Q5uYKE(kX!V!Fl zZ}2^S!hdiQzu^r2?4zBh!-5>NVh@~G2s_G9377hJ_GYbWpv3DW4kB8ZzY#+*9Jk4_ zu@c8ioG5WJ(ZqR;m@0E=iPMQ`^`IFtF^gzsJRA389%FTJ29L=(^Cd2jnEek7jxUn& zb3}E`^LSb2mP%YEak<16o}Yc-3Qk^ycjUl&qFTsCe1I)7zg^-^iMu53mbgdaK8gD! z9+3FC#4jWs;rZEAACrl%h-&rU;0KvIF7X$MCncVecv|8aqFVIXX04j6R$Ce85c5!o z5>&tiA42N7G@U3N>RKH~0(EG^91E##hmO+kLjMwV5wVBF28lh1R_1%5FZy91)Sh8c z)kAO#Mle?Q9SyZt((0ngn1VYo9cmw_RnNg(JcLK^1QuWssBg8ZuUhz0EXNA0k_Ws) zUzJfUc9X;pB>qdz+0v|~tEHyZQp;+oWwq3@T54G>wXBv}R!c3bRV~#^9Kl!k4nIN4 zRjtZoV|*HCo3#WBN^pLH7fcjN{Szge#G53_;D84K=G4g%iKD-3{_yWh6Q>*_5 z@>wR1%XPmncM4}@{8zJ<h=Bw#nNd zbxle=lau8^jS{CwoJv#=x)akei!m8W&Vj0{Iz~B@e74Ca7?aT?s+kSC7LB#iQKd%57fFw)tc*SDkM6HR>su5 z#)lB1&1tQsN-nHnq8@D-vxu4w=qwkjI+MbhOF(UFsBMkZwno)fJ-8nRVvt-vg#ImZ z{RoNj`PPh<@z}I<#!FOnR}Y^Isddera_qn7PM5Lzrqvs&+N(I5sIFxX)Tlk6<{pxm zA(k+H4D+!N&msLH%`2e(H7!_))mVp(_yAk59lNkcZn$6K0g0bWRJBzPK0;KBp~f}e z$efh9<|i3b?sWF#Uu5E>L{)p0($hHGtkp`bYo*4u)VP)!*Qy#*mf8wX*IMdY8$? z+Tq|+u2rA18c#$c)F-R%rOK!lGXt~LK%I0y=0Vj-o%EQT^aT9{GPg+Po@Y*dzv?DS zv0RR?khoIfDv9#>*1jX-brRPT)$f1pMmp+doA56=xQ(b5M%`XS9MqC9>5pU zr^dBX<62c?b^IqtS!++pwWlSXk$6_>U;7smJgknz)LD^t?u5ERiN!?fT*nTsqtciE2-%2ee?N^!cpo*3nnjZv>xqU0VHKs~c>WxKrXTiMu84k+@Id zeu)PpelAh%33b0C5|2szN}}wOy6?`7({-|8>ew)KvSI2@$;q-|>dwgcti-?0#gs15 zEHOu-?4MM=jAb9C)IMTysS=50^8KeOm>^v#2Rw2xAafz+qB2({b8N6woy^H5OY!59 z>cAZPBgKzPsvEkaL9XdVzpotcM}Hs&QUBBsIe|@;8X+gJu~OqP8M2X5cglI{ni=%f zo2cJ>73WC2U!vMmY9aH$eo8$C*-NQ~9Agip79q_hO1&%>$tFt4CQ7MIq;B3qRM}a9 zRWkPuQ9WQC*i0!lQ%d$yO7>Dp_EJjiB`e4GU_U;`5wIt+zyB%O3@No2)B}Gass|p& zNtu(qkdnQSl08r_d!SzJ0TxuxgX;O`LwzBn&h@Ii+_&B#(IwF%^{@BIgsQnZF(fe} zQR-hGmvNQEgv1(&vM1{6Wvupwx?fv~?Id=T*f}koE)u&*yhLJmi9Lv9q`m>YWUjBo ztK=A)s(zsK2hmsiNKV0>rWiCBlIuqp}8?Jte%&85hZt&klPM5LTd}=YX zARDiKt{j^u@ga#BiH{J~HEhIs*@*QEHSN6Y0~X0i&q;h<;)@br))!_zT(Bbje(~<& zW5vJQ^Xz_mjlHwIxBW)@IQvZdx18%npA9x45`tf0(OmMFWh?6R^!Wn;^l z%9_ibEn8mpUfJHVZ^}-W=a>7->&v^Q%lnq!P(G&ozVa8!H{)qz<><=0Dw`{xt6WvNt#W_mca>)x z`3|2W<>=<<>$u4=(J|NYtm6&G2abJ??;U5IMb4n}eCI{Z%bfk3L!6_Ww>$4~KI~lR zOuy=U)49>P-T9gGYv->n-BslBy5g>SS0~qHu7R$huCcDWT=%*jaXssL&9%<;p=+P( zOV9X7=jrHa z@C@(_^^Es4c`}}bo~53*J@0#Vc@BDhN_)%*hMQ^NO!p9;SkemA@=d@y`GqD4w0p-7v^ z#gRUdL6OmsX^{sbPeqnS)ov7>Q9BlbN>2lfIK)8q+ZY zvoITTFc**DF+7EZcovKC0$##D@j6yuH8$ZxY{Pc!#4h|Bd+{kg!$BNs($bN`bdKUn ze2*V-5~uJ7{%q0=4JO!-k3!f{igHxK2@lAx5kdq}kYj@!8|2p@zXtg=$ge?ujSfv| z&FD;r#k5gnwWP$gI(XyD<~@;9fj{ z2hohjNxktTNU!lUp24#qy~fK}3es!5ft6SV(rmngby$y$cpsaw1s{R58@sUwq}(9o z#z7nc88^td@g>sV(vWt8v>PYz8_wWtlNKfAQ44ZG+M|UiMhVJL0SDahg49QY2*W@O zq&}KJ4Z46#N6B=QOh?IdI!daem!mh>$I&ZsHLk$`Tn|zny$Pf{ItpVk0i-+Hh&wP1 zcVRkaU>4?JF6QB3Jc`FL9}Dmd^^ZPB=XtycQXYK;q&>O}%h7^2@fOx#El7LxJ&^Y3 zzd+if+pry^KFW@dlKSXA><4L&lJ@8^d;>Bb{Rtz1_X{-re5b-r2ldmpBe`C=UY;1w+lVmc!!;4khO0fa^Fe zIMx+`q2Qdbd*Nkj5G4j|^OPYxEb0IyF6HS^N+>dqxQHOvB47|AfZUCe&Zlp_f1dx$ zKO@Z?YJh*(4QrzMApigYfVu#19s7~6&8mZzz4!1aL*|z*Ur@NPq-=gmzD(S(DLE@; z5-9=2U>+z=ewI>@B&k9GecpmsYC~0|nPyxY(U@=(I^2dx0C0Q}%VsgfqH(LsF zRzvdx@F6G!zq7`E2o_p-As7tuEX@ODR_$-W(qzp@cT4v>`;eIm(!dBHS;(@O0h|_c zKt3oE8bB^Ez~tod@tLXD9YAfCS+!hTq;{!u)ONL2ESHdI$m1nb%#yP0mA1;HlH0C5 zAO;yoGRbfnrYSU?4xztLFVfM`e#!50)8YDLXo3-cNv6>{x`WIWyTr$8NUo48q=eXK z*VRlhM=DmHS_r9BidpECUMr%#LrO@+wrVLRpS2%U-myvcZ^UM?SvY3#k#tIQ+6LMJ z!WmnmxZRdzwbj~3D97yy3%$xkdqSR}R4R)s`>s7t&5c_Vrpt$I|C07gl~Rwr!&WE7 z><8s6`MRx6$&mX=Z`j&xV{P~CUx+c=bRqvI!~_fC3870|ZI20EmZpg(tn&Zc^X=Ph zPn80Z*c$DU@U{HHcHHt%Z!No6b}OIBi|p1G#Aao5jX1@=U49@D*TTpg~vuE%cH?RNKb4|h*; z&vTc!*Sfd38{H?}7u|Q<&pg!Q_4M~-dB%BWc$Ro7Jqgct&q2?5&u!0lUgULq2Y82i zCwOOjmw8us*LZ8a_1?YSBi=LK%ij1c@3-D3-aenr=kuk)mA(w$a9^&k!1tbSiLcyO z<@?mP-Phzh;XCWQ>g)7%`@Yw(=7JkEQyZ*}(xz#1w8h#-+A6J9tJfN}&$Yj6H?=OU zM|IFVidZHF~Z7XMK-;SZ~$O=~widdY9g#KiB(0Vkj6& z3k?s&Cxm8(7KB!W)`zx*nnSIj3!%UmA0bVxz+N#Hcg&87GZ) z<7?x-(Hn+gDeMoYg@=a6hNp(-giFFJ!!_Z*gb#&Jg)fIY!`|)K7Iolfgma+z043=P2+K1<+qXZ&%Li12OTCbJIS<0P63?xXwI3-US05vB#)i6e=5$c%%xz-Hk9vw_(N z4E`L-1sU)GuQPeDmzj=UGc))h=q4Lrvr!>Cm6?N_oRh!7w@{5rLV|xro%{u6C&*&Y zg2#LZ{}7&qr?`WlkniN9u#YQ+FIW@b;504+yym;ORQ?fXaQB({TpEq1;Vxz%DB@qj z9%=|1g?cWFYve@=*@b*1gSp4dGiDp3G9}DnMr5MQOEj7BvWOD4KU2>3;psG=<}mx& z7)!xqAkoQ8C9?;Nps8RNXaomg3>*cipcR}3?cfr)Mjp^oJdiz4hGHE@`T21?m~DVN zU>ToBGI1Vz3m#*)3T1c>KM=0v=YUdvI!YB9Xf0cS&ylfg1zRQ*gXN@xyUA4vm1HWH z%jIAdUm)4+O70rB3#E~Tq>L=ZquG1xT8xPs55dE58#zX2ktEH)B5;!HbPKf5`EvFYnFurz<6e_{=o&6Z)%YQ* zXNKVoWF8ks?RXo?z?JMVQb1n73bK;lh+E)Ras?HEYLdV+=m^*!myoU89d;gb1Mg&a zAcHx+S3ha#kLuhD bSP%wn44}I_O-*6z?_%)>-DmMYla>Al!l-ip delta 2291 zcmXw5ZBSLm8Qwj6_U!Jt_uO;N{XX~JbI<*dI!dUyrG^+oj3Fu?L(mvxlm<(cA=Fw+ zkU`@lHzpD^#3AOYh*qgFRFD`Yw}e6@);fkNei6r5N+~+VT6Bo9)-uGZJ)NZU%(KtC z`|j+!`~2DW_20t7E%4o_z8e5Q0AMlz&JVsL{LEZ~X1uNAX+us{%J-d#UrowSoSgJL z`z3ey>7-R}bCr`2vo5a%CboPYW!)8aFiN|u&;%iuf zVJT0LWbT!>T8)y@4r(N_oJxho6QSv<7$(qSeEyI?ZDweC|YN^gLVe_ayOQuw= z44LpM-$+F!E=l7Gw)IPOQn|HODw2C`ZMFwiV*9J5#nK{nm>iY5ERr>9b%{r;`z$-G zvACJ6w`C~JwmK7IO43#*FISc;3(UCBHcx%jJaDqyZapvUmujTzwtnkYsmRtQKO>*B zZdFp{m^9UT%sR_DV(YOKS@Xq$?@=V0uq4G{%WJkGaoE%pOVXVGKVM+mVf|Wp$`Xgx zeKsO~A>XlnY?f#=?_Dm3lzQ6(oB0Myi&A6Bwe66vNZE3oCD&SEIVRo}`y{K>B^Jp| zrUQ*qjWT5GvF$KD=(E-;HA;K|+RN;#?HlZk_BL2) z@3Eh@581zVa1Mtf>X`1xb`(2)9(SyBY;^2!{LXRSam(@0X>*31F=w{3#QC!GE$1%h zVdqijS?7rJpDyHbx~96GbS-c#byd6Gay7bIT|KTduB)zbH+H++Demd+dG00d74CKJ zcig+(UGCHFzqxOFkjL$r?0MXi>nZWPBd+I&gJ@0!CdyaTcdg5PtE_=p2-+BeF z1FrWP-l^UU?;P)Z?-FmBx61p5_Z{yJ?|yHG_cL$5chLI}?;VYU4VtX!+7Gp-wR~-{ zwp^>!;#$4dsC}S)qV;J5+K_fr`_{*NPG1D>_Ql`S`T{zd*}{wn_l|5o^kzt!LEKkdKj|95}{e1Wt;R^Wxe z@<4T9W8l|;!+}2p1_FbDtAVcr6FRTkbgv%KAJHGvpVo8r7xWUnLSL=N^|$qHdb8f9 zC-q*vPan{S^lSQ<;z^2ZJ|)-x{K!8)?Q& z__^_%QEXHguNWJRokpwCX?$*6Fs>N4jC&y((n6C%>7iMn{Ls?Ss?ckpcSCzZ?V%%~ z{?K6PMrb@Ngq`7N_{ZUA!t=u=;g`d&hqr|Hgg*@ThEIkE!#Bbc@d%B$B0q@CjO0a@ zz%L>%Mb<=WBikdbk>5v7M+PG|BKM=#XfT=>1r?&TxSJc`Wj+tz<1WE=v=VPZao$BH=q8kjAgUr`+)P%> z*3!6zZX?G@JJ&C)L}%!1u$w!<;(VG=fLG8dtRzRJa?fpU5m-eH>9AT|ma!aj=WJ-&k0a2DYvcbD7CdAJ&`l2f@U+&xsl={#bP zpUl0=Kg0`J0n6l){EIvTIY44L+?(7%kiiVF543?pa2er){s0QN65k|?k6+&^}-opH%cYT$SP8SXY*J1I*f^or{kIUDCuB@WHU>} z7T_S~*n9L%7DFR^J2#z=pCjwdpDk02<9Vcsw2)@7MYs>UP%YBXG2u4f!OtKUQ5#H$ zv)~Lk2j+nkxBwQx7hwfl1t7a8J|WH)vqes1q9S_4pqL^)BBrw@_GdQ2{?5kOzu0fs ze)bXTWJlO>c8U!E2C%RetR$29^f(El400VNh@W32F2&nW7QY#dqnoIaPtZ!fm&^eg zDH6uX5W0YCP(2<+ySdr8fxIZhQ6JugV)#|Qi!2~_;Cix-HsB;|CMQujs3&!JG0T8y zxRNAC@|`*w01raoCl!PuQSYSv6^$A@u~r#F9JimqLqrVjI_7L5hvI z>zS`d*Ocs1Vg0UTeS+VsU8Vi1L64R;8$B7x`b4-yH8?|IpGxp0>o40*8WHy%r*eCh za^J}eN|F?-8Y3<@RqE_B8Pm?BU7=K;-dLU&DDbo-T8YUi-`oYNai*9I8-t#SnUkuS zKjv+68p{1DR&7i6F+@?1(>RAqxPiN9K|3Dc37%sRBY2B(OyCo~VhTU;+m@U;$Urt$ zU=6mQ3=vymIXgI1q6&v`9+#nU4YzO)adhG#Ug8x#f`U2U@xvC=g#}oMJS@X1$r_(w4wvuc#J*_UoAg=t#? xf+VCN9gDCM1t`R3kU(GqGYF7CfCK`2aR7`U(1tF&z%a%!!MCt1K1S<*>n{&m;GzHk delta 819 zcmXZbPe@cz6vy#z=S4Bh-!#T zEVHa@NNI(UU}Hw(gK1%rEku$a0t;JMEm{;se>SyfQD3PGAGqAjIp=q{5AMnLW3n$& z)+U6=7s7Zf#ParkL=SIL2>)PaOQ=%+TDweNjs@Lal`-i~##+6)qN3c@o4X2RR0rdY z#)TCz-5w9fgzk>pMwPEh&&SuuJng9)FB~d49_kf2qShEIeiFQ-r|R~|7Om=Qa)RIV z-ukC_#*8;|NaRG`i4(eq6&%j3A8+vY5maX7C&@@c}>Z(-Gl(6vM)5L>-X|Z{Sjmt*Au{ z4xkN(aSSPR;v6pG7Vh97C>Wl`EI#8qemlYx$VCAP;YR>rtOO01Q70u#8ZbA4222_- z>#-9gVUmQ|ibF`E1E+8X-RQ*?3}6Vu7{xdyK!fHZ%z#8p5;0$60bd-UB$KI4UtJ%lO>bGnjKgq dV3B}TgKc01)>)j#4ctZsS-yZ$e1i1<^A|j2&&B`% diff --git a/intl/tzdata/source/be/zoneinfo64.res b/intl/tzdata/source/be/zoneinfo64.res index 5d70f5b02c035172daaa113aca5bf3ab02ae7bcf..fdbeb35dd3bdad36faa11ff8938ec6c48a3138f1 100644 GIT binary patch delta 12770 zcmZ9S33yFc_r~`=L6R%EPHyJu=43PzF%x4#5JN}^YKVCXiA2mK2uX-aT^wyqEp1g> z)K!OSQLUnbs?y1HTD02gSDo9hTL0gX+wbxGqi^25-nI6;_CDv{^!#$)vMS%2IOk*j zLI`h=F2rNOwGbiLQizc9m%DeC4bnt^?A~Gkzk7&m_iDMXo*eJ)mN>75IUp&+xC-j z?IR29AJ)GZ*FU}@Zk*i=+!(nm@EQ9Lfv-fm; zLA@~l-Qt?b9mCNxE%@q zN$Q%oJ^pOsk;Hm&uQccz)YdVn{+A7gCzT{U<{0Xn(O`s52{rM*I`78XVx4jC#HPeuZ}3Kg^I>&jyn;@}{Sp=&mXuIGDkI)EtbP5v z39(^)!bXHmj~WpZlF&Z3x9zpqkwKS&ZUy}sHKW1xn8sm?g6qc43abv=n)p$?Gipgp zYSg-zK?wuG_J-DtdMb8#oze9+xqccvF4*ncrrvLL57&Luw};;>Z^hg0J22{$YwD2r z((&FYe$V<&_3r9-(7T^+N!^=ue~2jw`zg4s_b|Vc>eJy~zRSJG$5i^R3+@#j6g)I` zQ}879<(MbK6Jz!!JQwpucstuWF&AULPM8q$-|&p^;lU;0)BMhB{;_*vkNI5-UKzYG zzIE_3;R`iQYptG$@1xxF65g}I*LW}VUgcHC%g1HQ_78BX*Md*QUQoY}{mOSs)F)bR zSEKAHO}`1g6@D!E*O0m)!BKzt`-FcGk{Hrf8xhjWKSay--sbzf_a6U*aMM2}+TZnR zcC>d)$k2es(XCw9vSVbL>!0js`CnI5PG;t4M~VM$0Z-ZML=O$wXbXsVGI~nLGjVpC zGvdXF*8}!zr2)qyt_PfpUJ!8A?yxltc_rXZ^cuSsaW3Rkz+dr2(OVrhdkaUnqfzue z*MXcK;cs~V<72B=?C4#mo!2$n0p+&WbmdN+7^T$ZH}pf9=(;lW<={k7hkvT)cOXYm z6^ZVrhb@y{i4>BCr%A6yBGHvUBC=H@F`R#oh;d3wB}LJc2+>qYS9*v>{5vdD6-6|~ z+eO)hJx)0(8o3USNRv(7_ePAZGql_kAvItN*bNSX6W~4YDYyylf_tV2^#MUZ1I<7O zkPfoIC@>Yw0cEcJV_FA{;_?_Hgi_DCMb>|{zK`qPn5O=F@xQK$(BtqM?lxn+r2qRA ze?a;f{@azFmk}PIim*^qgoRVp%L50kY;f<&yRHNz;%W@`5VjBg(7j=TyRQE&Q-r6h zA|lWf5xv|w)6%5>P>RctDqxp;*Yrho{hz1!w<;pvHAUoKu4aX$0rgE0)c^#mA}SJg zx?U^%+P5WEHr8m@i?hG>oq@Fu>v7kXqDB7CQ96KPz(-sO#SP^WSO4P9{%5g2LjMH* z%(bC7!}k`}cUa%MZWcH6U&nHA$tv}M>I$1P!T(QFMAuVAH2p_AT$OXueB-bhVl{SM zoHHT3Ev1eq-QXUqgaSH1VXmx_8~%e)bMVfC%Us>({_f9KMl-T#Mi%{sJAK|18U3Lt zoOI!2n$8HSTMOD5WYNq_SJwSi?tu%|%GegTQ@{#B*T7GCLhHb(gyy^NEo`6!9L2@n z#i*)?35A=xqn5Okz8RQ{Fss}-OSj8_jT9dTA0uCe@3`xfZIf}DG=)|d^i+kG0T1_d zk_Jx(XI#lO=Uk7jcDnX2uLz$>#B3t>!N>7hljr#)9&=}{D3t+BOuJ}`*aoVIWzS>d z-DbHEsD9f2BU8kasqrjBd?WYWYM1m+rMM8O6s~dC zJc_i7;tiy);XmBTHAsG@Na(AIgh6ng`}|`WitilE>zMy_Ya6CWUms3;hA9$sv?Q4O$u_CZH`xbHOv*5TU{?caov}JCw+iL zGCuhr8I!)l`rdu>$#})ey@uJUXqXEZxP!J`mcA=7nO4KE-G6NVOZxt!ibju^qEWH? z-czB{w-oaQOv4qmbFBYqO7Ef2exnPn%AIM^Ut%%MM&Ag*#U;dej%*oN#?}?MZ}0rT zEBII3|20M9=T*^|6>WTluvAy~=c`;pcVF}UNfk|6nxaWJck1)&r0*cib(lL`7x#?y ze+7%oYw{*l%JtikGTqo6ASh<#K#LrC8+@Xr*p>RVybwL66fYC;Q1W=-vDKg0IbD)XhY~G&0E?^s#cEYa{Y#o6@ zXpTGU;Ee}oyZJ>`v}kCG7OA+rKoPjXs#mzP4%JgaT5vnJV16xF?iQ!<#ctYDS*B|d zve0$q@D$(AaQ$V9mUUhIj|{Q33{*wSNKB`D_Ys?yy=4>1htZD0rt8FO_kHiGBAJNf zB=?!uFGyQ*3ib-@&F)>t7kb%~xnNsyzFTF$1@2~VUX%7#Ybbw;b{W3w3OhC3mco^k z!l_LObyc4lX-|o#*bu2H+}!ocsevIWT`2p*uL2v1D~3n83NMAZ%g;F!N1I{9j06VpELfY1 zuKY_;?zhOZfNxFFHb@n1+5NWhRO?_>J8)sLbhPb=RD^3DT!Aa$L5npXDbn6{E80nX zr{N2(9T$)L-==gAg_*aj>(0N_NjloG9qoFlq8-WCE|(Ts(t_rCZC8$~*(cZR?YKwV zZNQAH=1Z=dH?}2pJVNm-5}kIuNNsD|9%oFA z0STbY1@qjyZ=O~H7)(c&yVDd^beaKIyUV^-q^;8q?02z0aaG^mZe9GHen$BnzDHx$ zB5Wgr7Q-={_LQct-%;p#?VB<7&URCD=AQ3N26Rq!HTt%vqjNvZL73KDW1l(nd7kU; z?+aYNemgCs^JrY9xT-vDK26h3SIx#vF58_??VX>%#a?v24Bv6zz4N>Dzh{cnfvQN& zhNroI`Oh$EOI?C(V4rs9+|88HmrT(`sG^HE9O!BIIU0_koNlGH`{IuarM*j2{3L6a zVtA!{)Xyo>)T(ezS zlWsolyg%zH5#7R6(X9a6%6TjI_pwH7tuotP_SZ2lN4G8bc9^0&mvwh$(7nu^b)S0O zH&Ev7r~7xN=pm_Rt?vQqE;I_IB(-~lTscmwe?{DpC)j*L|N z8BNbDRrI9wo-=f`|LC*4A1AV(b}%u&$ODSKR~W`xM26ApfT0D+{qIW0k3D~n}(@KO>tj|iY+V~?xc9r(t3vn(b$PK??q=(6)GWGAsJ= z#q2Xqzv7g8lKRY}T#2>@evAs%;NGVax4K+J`H@X~iVnK=>#dBdG4iam_j!guUO@VK zo1$-waWGcKDYm}N5on?BPQ#3s^%Q5{!=~uRe)nU)`z3msy+D(tpwg(5B$Yb$emtN1 z^&p5<&1|U$HIWBwncT#gW3eae=bOkew#+%$rP#~$4o&56&df)#S))vAHzYMgO7r>VX%*Ua%j04z4heRmO=Ha*vm@KR0auLQ@QgRKj^RmT4V4QlcdBAjK-mX#i|&{um|b{ zSxb5nd_iEjai+a|TX78Bi}Qdf2DMbhpw@7Xv7?jxP1*-d#bA>L9fvRJyHaI^?>Cr# znIcQ-ZMw*jwk&^DWQAf!7@NCDr((}a!dQ-20dLpe>LzTFTH`=7jpQZ2nsu-IoDci*4OMf9Ui3$#eGXN6^RMUj(l(axx{?diF+ycM(1_4)&M1 z(*Ju? zYkAV1y0qk;p1egaHa2HThqULgK11u9VrVqp?t0W!8D^XxESF0A(B`PK@D{@>jZxWh zptKF;DKYc|gsaBE9JyWkey@sQZ0fLH`lw-Ym3>$)<*{fJ;K|0_Ve$zjVi+kh>~~Y- zhSCQqB7J}j%-45~kaHcmiTE0WWL4zSSZ+JL*+@CinVX5t-sD=D%?zamw|M7_%Io%YGNK=gB9d%R&Y~82U;2oeN16ZUVE|B9R zM(x43ml&3K)T_j>!7>o?GTIcfLjLcdlQW|OO))yjFlS31wxc^BFyhe*jHqHOiAGl- zyo+#Ee{GJO;rjz7D>nMSdUA>E7cs_96=P^%Ot5DV;dGKtCxOO>5;_5F{?Gx}TQa-n_Ps|3AHF!LEN zjs7d;YH1tKhobSh2vZGnm3#t$7pU>a5k54^D=Rx1Hxu_Hyw%vXPHvO7 zi9Giv{$PqpQt$tmJQ*^HsZDB$-L7^ZGL>B#sVA(L7n)4!jougk6u1C?JsPhIELK4m zu$=gYy5^Ff$4y#BTqSshIxoNnsbi&0Jm^Z?C_QR}oNJ%-Cce|ed;niCc5IL?8GKt6 zlbf1iGHpIclkU(6qt7N8A{~6}u7?!vFb zkK?zdkU>j9AVh!hNjcpy(UGy(nfPnu#zA63lAgl8GaFUS#V_R1k4`81P11$&xjw!<0P2>te6`I|j|9y-T0pKkJ> zH}34?9nY43R24J3nPTQR-8>*uY%@7*GZ$emF{0e^X&Ew;J9Xv<2w!?y97l_@^%o5} z-{}7e7hz)4LgD=x0Y8CXO)-lkp2c#_n(V1Co(hHfy+d-nbJk+?Qcyz-CuWwl;|l%> zV6H)b$<3TdElyC*20pgEMYHyN^#zWJ!^Z{(ej z%cZlB)G2(`6tnHBm>mc=_S7h#M#-j=a$AepU68wjY(jG3(S&dr2+4nWU?P|aiqQVo z!2qMjn{t`#Iy;{lMc{2}zYBjsl=Y^-!&mBH7jT1v;BW8`xc^{kLXn$J$tvJt;JenUR;wEK1q&>J3?%&Vt{*V?@8^@`zernr`q(t3I=O5BE zAxbUr^ofVWM9OGK_CKUGsnuTC@sQTCR@++hkk+PFTUYjw*0EMwR``(C)zbL7Ql)=> zYDbt>D^~BYB#+jI5`j-VJeUEs+U^tZzi~q-5qIePLt1XF_LljOHmX*O(*D&rB1N1t zt8$a%e?>IUk?PR>A#Fx&T<@%hw8B~~C+{Jxq*fbm`TiZ?!dk7c%#u8lv*zBGj+fRv zB$iY5A>tKq2pHf9dpRTC|>Un(+M8F686-{L}Jdd(k%hhgDH@ z6n@hfb;k29RUB!G;%2q=-+UX&lQ;N3`xD%YA66s(3acw1Wm!Og01UL<@f$#98>UkGW0@O6GkdsCG3Hbz~r z-tS6sF?fcSaQ&7Xpj8$~z776kL|v2zq_c#aC^>D4xph=A*BcJ=1Z^bfjB)3ZO!2bM z?SO;#k+~nhJfS|5dz6TI^-VFaR2B19z)yKilS=S?Q_S}Q{55C(BKUFQ20d6Aot23;e!MP^Nc;S~xcE!O0zwyr8Hc~% z4sy{VGx(Wb))cSIZ|;h*^HANUdq}mb$VKPgMcq6*CyGa-{f5B zSjttpv?E}xmoko})kfv-JQ^aF^7_5>GQzi>E^bi!7WheL^j(Z`f67zRQCim&rM`fN zedz>vq0!+lUbbwdk0Ov5rKWM_o-CEtpLohh;<9uj>mT`*w3p>zY)9M)8?U4*gQWk5 z6xq;a40@Sr?2yVVXajHB&53Zf^ zbUneY^bRTKt)!gJ$_LlRD1L<6^)kEC&R#wmowY2V08i52vMc>U%4cJfh2`9AR-62t zUnouWga*o&P0ClHbIq0SB<4AIA2Hk!f?G)3Aublgfo4Xss*F?|iV9UP z3|EHODpD-#AU(*JmV)` z8K@UVD94g2Mxc)Z1;ntJ6-zvAS@Y}!I)frTCsLX0tl)a6*a)5^c02sEr@a(nQuR+G zm4WsOH~Jy`WMakZdYdRE+xh@kaUSU-_>#UMN?8+riz1(rD}IK5_p}m9E8X-C(Mpk{ zvc4%Q?I1`Mm7#Ei{#vxs&Q{qHyES%O{a&;(%vQ-mr!oV(uRhADbhTCHVn2dCTHobV zHrXquQ6^0)nOWsRy-$oX%vre}`$_C=o|*Qf-wZGa%-3IwQHD4w_u$_LUMALnkLa4F zWLjSVS8{kOKh)=7CSIj@9q9(l74RUzc+@Gp;VAtdv<2M(XF|yVL-jdvN>6)LE-|Btod9zl z;*`10DkfT0ioJrm|L^6j>M>(@yprPOtlFfC)pWReSZ&Y?J7BWadUaeq$=ID_1+AX0 ziZx!QSkna8|9hod)6w{&F+nM7x)SsWLI2bS73aa8ma6?JQSsq-ylRIrs=3m_%UK<& zit2r)sQ$P%Xk8inZ^c{2?qsF4SM;~4Si8a$Yxm%xp@&}r*B&wcXw3*p*B(>Fqb$Uu zONl8hiYAR1*;c!8Xh9!N2tq zG!a$jfyOOhRiZ*vLqO+NCs9vZ8n6OS>hHBzB1^AfIz6yLe$hm9B(U0iFb4R+c+mP; zWw;8wqX{QXJNIfLrW5)J3zTcXpPJAnVfTQEi>2Mz$2Acr!8GumCgR(It(quJpuvQh zwUraS;KQJ^CKAVj;{8fmdoG zxjEQQ`H&`Bm4Uykcng|Hae{V$U25G5Tm*k>qD^0LRTFJnfc1cKJGGQwz=$#Bo085|I0W3hb2Fi+-X1uJ4KKWpqCi*6Uy*LUq(JuvN zW|{v>F3a|4_%lhu%(t)^aDP^5z>r$sK-I&~YGTkMz)EmtpXCE$3%UGYd|9-mG}B7O zU{2y-GFxfJ31xJHna$uilnHoXpV7pS46siV*{neJFz_givI^O^HIdVeI94HNH#nw= zp^ZQ_xQ)&UlChc?#^5A<$SxMJOJJKOay9lpm#oYk1sG-SGnyD4uZfYPYXe7Z)x@Yb zH8HvsSPs5Le_s=0*y}M-;1$5Wj%^P{;$wDW3t=aGO%r(%OvmmDZ-zU7hME}X3+QiL zX(hkhh<=(F?*obfOFE$^pn~`trjrS00Qy8Sdm^)!gJG@{>CnU^@?=sEz%iV}v6}RS zCMNd-8^BpjOkto?IC3%^^rpN6oYcfrR=iX;rm!3b6{c>|#I$;~olcuY`D1WL6Vu7& z=`=iJnI`fB09%k>L>-bde?Lr~%$!BNx-e}$;P26y;Vg1x79AEewrnt!GVK+VYoaia z^Dk#m=nM8}Vs^48XfoxAl*fZ{l&!s-3i3e#m_R4*!#4OdI8bW~>sIE1l_%i~fch4! zeHY8Y7vL1IP8)*}7kD%XD?=^O1n-iF3_`2`)?luK*C`(c`+x(Rttj$>S*;?HsHg!5 z0^xvtFCu@68UZe;q7*=G6s3Y5o;qwnQ6|U&r9=5e#ustj7EJ`x083v)9u&<7O8|*i z#GN2Fd2k4OBV~)XSPaBBT4qKgD zN14W#TAdKTbR+nS&d8rqD=%);>ScpC|7Gvg8q1<#DlJ+`xW9 z6Dt_-ihN+@#Bs~7iE?ILog@p9at2%dWlLtP4(QQR|mc zFtM`K%1mxL!7_@+>F}5)R+0}ZS*n#kQ=z{mRy_&Gc7-HbWon`#l=5J>1>j<-7y>H6 z3+SC-R<7cjCMxRyw$O^LWcCWTXeF_gNWXUT(1$PKwCQ1iQRQZ6Olsnc| zs-jXAt5H>r-5;=04?tP|20jATR;8j_tHGeExO`SW0;XzWO-sPwtGxgZrfTx0`ZBo9 z{;%a;U;COS9$i62>r9i)f`&wAU@hl(z@Ayh&)UNWkKsbtTIL6f-36hAP#8 zx;WaZp`{dUwWWMio$A2Xk+yX5)&F;r+voAu=k@OOuC@2sd+oLNIae!|TP`fItc!E5 z>nVir0r0y1br2!gQizcGucvpGewktbc6X7(-x;F6dxhLvUygOB`aagmy*Fh^Xtzby zi^?74it?NChkb-^Nc0K&Wa|~{x7ObpC=DD9oB^kzFNTKr#z)-sZDpV1+a=BsaH&DF zfNuis1=eejs#ds)vy;njMRp1t8aUDJ_8k^D%XdO#R%lA#vdGa%canNH8jzTn@Jiyf z#BPoJ5>6)GPx4P3kvOx#p3uIbkNcK1IGj)rTG-${`#W)ok<;xTH@Fy=8b2#;klhH} z7`Zrbr~T)^gORTImGRpGPeuO~c**`x;5Ts-{A_Xa{GtNyg)RtP9lAx`P#(Hh-R-nR z?u^uf>P5cqRD*(@Z6mKm{^*w+l<1f0%uM<;ZcW1HNzD>h$Loo^5`K%@;nz2)eZa&9 zH~oeujZZ2M80sA1SKzxyJ>r}e|AF7^pk98L0NU;||BF zaUb}d@VgM^?YtXwD(+@ja9C3OpHc1Oeh=%|;7)>HSf8*FVN;`e$9N|s#3&Zp4I!l?B&}9Tm1J?774f@eQL2W12=SjOmilIqbF2dQod*i@itJ-&C*A z6)|{B@HR`k`uFP{uJ^8`d&43h#m81UZ$@9TO$ z$BYmACAhs$Zo_vR+rzyqOMJ$~%(koz?iC&sJT!J`@I=S!G0VdfW1dae7_&FLgY|68 zJ296M9*emh-aCAF@T~AD4KKv}9lJU9m4;sgFALrn9~-FM?0S9(Vj0d(rZ2)G4){YhX@6^5x)f!jA^u3#k_p9Q9wD zZ}>+ci6QOP-XXngA?o8kTP!d6?6D<;8@4u4f4hvFXyl>(O`>CLRhH`!f&MAB4IvXF z5<+HKzVq*G+wPwm(cZStb~L)R?Y!47qJ`H@ug|;(cn|XqvA*Dy;GN*r*sGb>U$M7c zJ%(guWd+Q#-S^*S_m0j8*=Y5TcqV#i$j;aYR%gU35pVnNQ=jlZ7IDM>!{`G4>-GR^ za>zmdAEM{k)rb#6PWk^GpC7$4z-n(15FXGt`Z?E?A>G6G`uyW-tv@p$)4PM$7uNmC zZLg`y58g4#B3GNCAG_-1?h8&9-u&nA{2joNj-DtE%QQt1jq!F-Ucer! zydx4_#)u5r*q!kB81JF;4G~fW)`Klz4>$zg0Uv^^;9Kwu_{R{TRuBT>KnsuxGQnVw z2d0AAt}A(M!$)%6j21$vXWl#Ozg^#FkLQmoYD}{21>)Qe5vs#)xQC4KlD1PcZy|jT z-*ZjK?;UP&h%i4xg!wasmj?li=5n9RzoGa?;czUC(yi5aDSK5z)X9 z5nbG+Q!=D&0L^(wWx$ibX;=2T z4_&XVaJnumsSck=#1tZT!8%@Z^*zBlcX4I8^k-%2c|*kdI7BR)9viuTnM;PZqE&># zY+{#sI%UG!8Tyo~r1~BI&3K*xSBSa>|A6NkSCi#?Y|;>MT^%AW10LcwmX}N0WSTpW zcES4kW&d^kcXdP8*j3wY=L``~p~jPhc-8G#?UJ^3G-n{qfot6R)*wAg^BU3(_>Mb! z9g?>p61qD?LT`Au`_7ZS70Wct%b35o(>D}I3s*rR*-6ZH@7p*>T1H_q-^5p3t+ch4 zBUm3{U38t%KC;|&h$JsVBsFwz-5jr2!Z6D)H@eP0eZ#`MlTKq%i_g^7V$xSw-?+V> zjaSUlYn0^>jRwI5?si+QNy|b^meuHnJ8bLU(sJJ+8s`|IF+0CKR9fa>?!esZO4~8U zc8u0Z6vl6S*0p;_M)XxImf84AA-L6q7{`e%2Ni5wk=yr$kGz6^#LbP;WSc`Y*#%!D zEX|ew(sI|V-CtO~bBLym4AHcsd(=y7rKLA!HRfj5Z+pgAUd5vBn!e@Ee{GudHSZKU zkI-UU%N*Cb1@&DEH(Fe6_NmsUr@2Vu4Uyd0HEQ3t)?|iBF2tOrZB3C0?&8<$D*?%s z2sdzi1^>-BDX#NJuDd24Sdr*&h-Up9q8VvvHU^J*jTM0pSw$p>2c_E9dNRn}_+V4T z*=#z2v%qI`qMDlBBiJm|>CjAfvHq2ewiu#$Lx*TS1}?>A-f1P^CfTWS7r#+o32DyB zZN7?_Tku1Cv77ePRA}kZve@m2zgPwKb=qbr$9z*DGfpx3?Zia}3gWc%m!l{edB^XJJxu ztrs$BbKQ$s)DrjH_g8pDv|fq6#v$5tG(;Q9q1L|y|7v&C2eXxsHl^qsmNs7zbITBI z&BWNKhcMUikH*A?J4D+?sLfE#ZI}&~f>jJeq%z%|ej!OFwM``^9ZVv=5H{n?k(PlC z#La+5xz=3?bHDI$fD+Jl4KeG%&%~3kb`4#tu0*-N{xnef$6<1#wqy6(jig&jZ8!DO zBpJ}I1dY43-Cp<@zJyxezRwhCZ+8jpFMJOT(cbDhe)*V9rPa_>afSo=zNEhDsK1l9HV3qxG}uYO@~zZ3ZqZmOvLZFkDG4`oPuZtf0QhUj3HqM6+_ z;IKRD`dJy#f$VkQPrw#yL!J!)IN`zfHBK7?@vS z@`AgyB`M{uAv#Hi=)^-iHKez>ZJU`=W6%W50<+y`Zk<;AnM^0r-RXJ4cfcpzTfbAJ zwG+2;s+S>B{amkn|9osDtz?vza61MwbMPD$R0hXv+Ed=srEV>Def~q9J(bUq)V_pL z0;#30K0o#dNL_+ijcG16cITn1`7X!b^IX9{O$kZeh>QCq^#m?+&}~q(Yv0CAuBJa< zv8R55i@oR^Xo$`UZpWS9Yj5|?RY)t5wz-3T$(7d52eE&~e&{a!HA_a@43U=N5NX}u zEYH9%GO&|&PqVJwzx_5}+SA74r&`lqhTnECxZg%v(>}tce7ZDnAO5|iSFn@jK8NT+ zuDkq)?p5__u@ySM&x z)GMItMSNEb(XHAcy0L<8hjm{4bnM0(G(FlO(&OPybTpIkI-Td~>%1kko&Fe(Aq14e zD|BwYfr>qSGsd5Y%(#2F{=i2@DmJFmy~ZKBGko_Q8ro0Vn)-6MHnoBLJfiy>hUgLC z5IsWSmY(O#gAeNY4P}TD(4!ZQJ_JwJ66m4w~V=K9I)aXmhEhzzzOBLUs4sX<^Y zmj6-ej#2AQ3#FMfuD5 z0U4a}3@)S$3MZo)Ua9Z)m#Na8@ifL6#B=Z!?M{Gv&zkXrL-cH5h@L^(@jw~cYbs+F zg9X663^#(O!4~ieI0DRj;{x~udlHzA zzhdv1jd2Q*Y4rR~PY;#HYQGkGWf`K^7|l0a-jC?T7f7#XuqnLSN;pY=mV)JaScL2< z?Y;KnJVem<@SpmGNcomDKe;n=43Syj>GU@I9-ZcDDbez(J##+3MZ`Q0@77eO{4gT( zF!p6^gIKd_&Jw>8UgFAsxu@PgMs8Q^nLiP5*CBe(F+}gDv=X^A}~UqYlj+9 z$j&}@4AGZ;@7o(5?HToBMqC7{^@Ju;@wWG!g_B=0B4E4iPBy+ymz zT;^H(y@IV{zo`vxA@4i;y@yS%`rTttZ%_)(fU7J!N}twJW+_eT8zQTLLuAc_SL3S> zUIwp%y}&%e*OrTJ&<%n(iYYQli5oB!$8d0fAf`RwBZAC~o&W}cmHO>e`JNIm;9H#E8De08 zLkuj0SLw&Q$otYha4QCTH1Kyr46X+F(p&y2E%hAY zu`z~tY_^`=S8kHl$Ce_TM!2Hi=_h+2a6ku>w!zKywEhecGPoN8J2ZGP6Eu^3AN;Ou z9w0xo4|bt%!taLP(n|+Q?)SkTI7E(@A#(ini-Y7aX-lL%5{>8P6zM6C$@S8i!@0_(02kUM|oN=g0tQ&mliU zG7K?fDBg4}&5&XGogs3Ov=5nx`Xb(!;kWe#xpJVi4&ik%)W;A*gY}EUA*<{|*V5L|xCw@C(H)P=r8w(~A z$6&cdTK~~uiW&gBfUpetwFaDD^Jm<~`j4X%w60e=SKa)sd0`s*iGvv64kvH*uOAIL<`3o@${s2hPhs-2H zHpLL5sF_h&aNeO=l9%qNVr(Wn>UBMBwpl}?jyc3=FGGwD);^yj3(bE87)`=Px6!ia z%6<`}dt%dnG+SFchcKRz!7~E%19Rm#C1CUjoMdtII|QDFZ)%OpWTt&ID;xa)?V%y^ zq`sg`u9U%k4w1)+$eZAqY$O9EXi*F0{D?fh?eh4x%d3Q|J^pAO=G68rB-?ppJC75R z_dL8!f3Q%#C?oRrBK&HIG4(vNlXOrS)LT1JF6V?t;)(&3%9v!h1!3K{{b~EftiuDF z7RygU#&Cg-;hAGL;xiKn$$0JdV)U7u;J;G zOrOtbx7|6%d04xUC(meKSIhbK{9g#V=MZCA&e%@+v>LfWTF3I^XzW^qt%p{~r?L5r z8q3u-&Z57tQu4zx+#$w|#C}3gTWy}Dapedc`*A0<4Qu37>o`9A#@)casrjyzJwnF) zf^81)XWewfUreX1mcLeZv(+=icwdJY-vGAhudL;guy9+CXJ5yU)f+y^E#e$M6X9iq zH|XyTegJnEBLQ^OD%Q&m_VMTNUm)&N_>z8dz1$+L<9X*zXk>^9owR8i>>s*cc(KnLhHFve$sTpBJ{=hsfY=?@bddGD8N}cZf-y4Kb;&XOJEY;;-#{R)%~1 zn3}Gie^yq>h)Eo%Nu!9|0Uz>2_GF5^v}s#p59g#a=;!c%1oO79T|y=!1%hDh{1!Pi zU=n*di6u_reK3g`O!`&t^E}H4R~(|Cw;>8fc>0;kXEw5*{@YewAQ1&qaPotxfQJ{n z?s<3=0a;r1b~dfx1Uml+Qg9l6U*E9Ze9;w9J(D91F}bV z$uA=?k16KqGN0K2WHVoj_Uta1VGG0+>JU>HWJDy@Zl zeiW7=EYr5WE(eDcGE5;ARJhIaoMB9DxaPZG-nSR-Md!2@@|eOe^@eWwonkHg)gh+M zF~qc|HXV{}tkXDa(>O}g4(e%#Jd_I!xE1-jwT|PaHtk!5LyWFi)5pZk~g2V3y9HflBj#$20J= z=|vqKqNp33ODxGY|Hz5p2^zlIg*Tw14%2Y*0#Paw>XP7(`Ltt zSbot#I+;5*0Th54`lzEMHlXNToTm*jofpRRWVolc^|;(0F`W;y=~U44neco%o3ot^ zrs~s9@N$ovUV~#LU}vVA16=k56%sU)c8;dLDI05tkIMdf#k+EebWZ=7FfP90Oou4W zg2_?iCGJ8B!-*7ywK$sFdj?;CI9ac1N5=)$;Gm3@e6d> z1Ni5M5-&rPgcD{ZoMHGs5JK(%`+*xg0RIF3fQRNxH1&)OEoU!FQs|~Ue0cW`j8}9( z>sF`D%r_;E){_=-6SE)DIEbb;Ed3E}V4e1r@ragFr(L@6h&Eh^ajK}{ z_lQQ}m~k&}eMDnlP3^gLk7%UI)Yeu!qM4~fTU`8zHrv#Muse7@f9h6TRwu67YDylh zf);^KKRTIZb=vOZ@V{{@Xc2el!Xw(+I_;$Kh_<0li&Fp9%1QN8bz;+2|B7gyW0jKr zh{kT356R4aMB81b4at8*d$mp*SNw=Z6_|aCD<08w+U*e+t$Rc~Lfe;R9RLTxA#j+! zQ^8y?4=k)Lop7$zlCy*}gy&CPB0ttPpOv54OFqMYhsyjF{###g&hs%fBgYUkCe-zl zJX#*nqdt(6WYZa?IQW{Hu@^o{fcb8O<)`2V_y*ht_w`pk>~^96sUs!@vUl_$?Xl)jSFxUnld}>3J84@ge4I@IE*PJ^<+Q zFYveS_+BpZ3Yhl;!M_<|{sxDbuffOltv|_Mq<#JsLzFdkh_YljUEg}g{0&n!9D^_I zGL~3&R^RuFJR~E^J~zYyp1U9(ZqIYgt+@u3=@q{*lykuV9N7ds4Mn*)2`^FANN*@q_rX+fn-+f z)Kls!{C=-Eitwu;7E8UxN7*550S>Wv81@uqno?UPdbUN$mG;F8Q4isL3qGeGuqrDM zuNz{Cze6kug%kDu4V5)AWC@>EOR5o`Vhl6o_n=(;j!pSVI+whJgMZ6e!ilJ)R%_F7 zlAt@_5B-6k5-$_k*~*q+h(lD4geTPv#NXzh+H0qBf!5Ps$qcFF%cQcJnB{nQn9=~) zw5|S12Ycm4bdp*54E&t-wZGCYr1B+f>afytMJnOMH`RIuC^wr{9z{O^t`TzszQvea z65=-ao;Vf6f@D2APN& zk2X0{>20$bqN<@oR53=Czjh>2IcJH%?1tG#TNkAawpNkEDw0?=TKgeN>ENs?#Ga0A zzA3$VTu0Cs^aGFc|F)D45mjaQD~PLvmwD!&f`5RvE?PO7RP`kK2C$2mz3@TLSdy4d zAQhBorA}p%vx*C%>I3j8v6tbip7B}}(^>n&sSLDNeUJVVek!r*o;D;#$uWP!Rr4FJ zx&ds{4#X%c!=q{PGr2k$Zs{2%gi*R`!&PNQKy?OsCg@MhAb7C$xvF%qRu^CwV)O6G zu}ZGBnwL&>Ird_0L9Ei%TD=zAg}qTb8LMovS8tiyc}I3?FveHQyu?9V(a z?ap&E!9Xxa`#eq=98i4||1H43xK;lQ-__FNl`Qjr9M||5qQ;_az)TFL8HyAMM>CpP zVBauG3y=i{gQ1#tf|6xpp*5`u?Fe_$MkOd$?KQn=k4Gzjr)xbEl@@U|oPip)s>a+Z zhEv*sZXg@vfFat3M5TwlW-T!riRC=ha2^ts+0GgkTBBpXMPELgP9KLoXRPLZeQuJ{ z#>-jrp+hV$FvRjTxCnZAE9?nc{+xcMi5awfyF;w#Y={-(a1r$AC*6t?J*+uFZC1>7 zh?RbZSlOX2Xl6d_8EIuNT6BE$8*gPleL*Xwg_m>XAUfVM#43AT(Ao;v({WX_ex|L` z)+;*BAy&Ob%uPHDw7B?@n7evdM`lpI>b^s)CK0O-5wob6pBG$B@ehI3Gd{C>!*L9*pR1C;NOk8YZ@Fe(C6>($1Nmax*2OCvU9{)d8BuuR9obWfSgU+f*90qi7T@^`8C}~Sw zOwtwFOtR4o>~xrR;~C&h@F^M(ZG0Q1Zxi}9?E!X}Hprm;4oqyaxtL>Wxkz55ie^?Y z89Y!$^M$nz(W1U8T9D}$=1Q)rqGc?+6rKn!(>|z*R)G zhtuhp{-i3pQ&ZhvQ$>$d@SZ9%T7qn1*TB=jdhn&EKmMMPfR*+96U|UXugTz5Rb(ol z7`%?20mx|Pf7$=uFQ}sTXR7Fv2foEY`ua|VNoPNEk84x=FQe@OCxBV#OgM`y^8W1wbFq){JNMG8?`M`>SFCbuwWd*bjbH#l TfJ_5-`z8Cy3=9lf7tjd?)>- zih>E)joJT#H)&Ai1s|$na@V?tPJU4pQ|y4^n?f~DVc@B6sG^X#LbjlA4}C~qA?I9D zC(~Y}9~aX!#xnVdMD!AvT6uy87L7G+P(YjUijJsadKUIn_J8_f430zbWKR(1yZBk! zW~Y3W`hg2TAt(alc*uF!0-Lp9Ry4MF4w!YsYQ@LEj05Jri^aeICxLm|m`rWV^>UAR z13pV3wuF}eu5|eYI6~XJxn2VS*r%CLXLuvr1M~*{!DAp7P(LN+q*+ACR6uQ%l!AGl zK3sMsm7oT!2IW+Ii3Xkp+W@IAp$AG#Q*w#SCx2!)CmX zeNh!Ng8`S8G*nUA1S|u0vHwuTtno10Hams=pZ#rJhdIqWY_6IC=8l0shTm1iJb&;d z_EA;LKL_)`vH^fJ%d@IjkO_0H7nlz>w}8PHnhzm<;RmW%#1UOY{gj(^akEY@uU18c zQe0jeR57%!Q^f&QEcT^+3Z4s_58$$p)W_maRI!8^FX6(fG;89h>8H)AE7?YAX2Zn4 znRD|>*IjPr1*e$r1G9i5VPb0wvz)yZn@#XQZm^})!%|YU%K%{`62ox!0t0D!VK`HVf+VB4kZ=a{%r_b;F-}9bx?mhSao_hmNxNuap z`IxFM;QFf&qL~nxej!?1x{tI9IY|h=eoNPtc^Qk>FPQz}k~Qx3(psOE|c zq<$wJ7LSUdVuUCcqnovJ9?L27O3K8_psPNkEU?UZA@FtPiL9?^MNUGfv0|&(5ils* zD}C9)oO0bk-#fZ*JpWWKR9d9A%ALwUmkqwd-rj-9fxZD5PgNpymYh;Isi*Xy)W+pWXRW}{pMuA{!2 zIbXQsoD0n+_|Ca%U2o-tcu zx=pSBiZW(GJC!d_Suw#9>`5tkC$-uu)cVF#E1jk`^J!{5k11y+6ie3>-E+mMw{?Tv zfs9b@X7vi~7VnN`$K8XP-O&EtEvf4>tl4$$C*7?A3%sv*KhxaE+MiuVCaa%RSE!#+ zPf$-%Pf<^I8{NOruF>|^e3tu3vqp7ivO%qAYyErE(L1^2xfAHFuJhDt=2M%qnOgTW zAt{@m3;gy)-_FcNT_4RZ-Koq^bscrPyaoPcIbAg;)Fm{}(}LRUFQ`@jL~Yj1bpCKU zpT2rvKgEIlihH6@TB>xN_~zq(ql_j$-MXpGNze43q}YFtT2+Kv^*(An&rz!>rZ&4g zo#{YrW@l>i=cP02sCAX5+ucgXN#SNw((!bqVp4mrtWI}S)M_)RRS%-pdo7)RRM|f% zU`wS()0NYnp*S5;$CvsL+GN{8H9 z?a$haqJwI1W>B7?Sf>Uu_iJ`!Zc=~f8>#f1+D+=G%%3_;>bLFE)JLTj@8!LlcUY*U zioC=61w!q9PrpF_2KDuC==0Mm?&piQbc`A(f?m(xlQAi+g2-$Tdn`OPTnr+=UxBLt}I)HTFIF4sq~(5bjDK_ zwFu~ibB~bpe$)%^tYi>sk5(z2InnOX>V=~M%c~p}>B|}P!jz5SueKeZc}yh*l+{&J z(b`kt%&+yLAO}Npls>7Msoi>EZ6VZoovbaa?Xj=j*7nvd>HZe$-gJMj?Kt&q$L(h7 z+s*dg)VKGxZ%X$!**{75Ke2zA?tf{&lm68|Q7Jds;?g({$x57KLAio=b-Z6=oo1aQRZ8=um!-F)ccpF8uPTG8g{p(9pYu8E zKGk5=XjO&kIn{Jkwd%!`^+)GwOQq@+e_PdZ)!V+AzJ;oHRa;dbs6Mi!RC_ITwt=c6 zs;~VIs=iTuuO6(PrCzLF@1L*UqW)NY%yrej#^2~{QvYJOtjX0_G%Yk8{AV=%@&{-h zvCX%=rg=hBshO#HNwZwDN%JSo0ozK=5zSY&i?$}s*P3rMKWVeHDN`WZZqwQWcCD<9 zXhryPxr{kq3=Ps$y2&*&!WX6qK{UUuqquj^Lp8k}*T+gdF5mIpbzI{P`x zb=w;n%7lC!G=U$>L{I~4zzG7NJ?I3wf*zn0^aex0Q=k$&52k^cAXSBCHdq8+0k4AB z!BX&Na0DC!$H7T(8vGTU0~f(J;5%>?U}HgSEJz!>4gLq*D-$6JV56aCAPeLI11KmH zV?$;Hc!Cg~Amjml5CqLZF^GXAXa%N%1>g^$9=ryYfH%Pk@D|tu{si`e&%hz@xpJY_ zlfpJb*k%aZ4E+H91!#N!E)!uD(1Hw*4fG%%n1BV?feUy6d=7^|3lITuPy$+mcAx|3 z47!1y;6c!*O!&k75R`#|U=SDrhJ(kzDDZ@`>Lp8RI-*%11!}-NfQJsh1W=_gsuV_* z!l+UhRSGW$tH9e}EqE7f0Gq&8umkJ_9|D*YhB;xF6NWiqm=pdSd;z`!r^-Ys{568J z;5@hlz6DpnHE;vm1h>FX;4b*3Of(lj4RjzAkq8ASZ}l5fzsyhf?x0Fic|vrqaH;XPUu)OShHAjpm>@h zJum_@`puwr;0AsW0!1JON_brxD9T#Y4s--vK~Lnck)mFpFV&wqW#D06G?;ZL>u{(R z<0HW+Fcwq*Iy1DXiC_wtfj(WU3eZ`hHS<9&SOn?;or6s1Qm_K7M*WM{f(Eb=Yz3%q z5!IJ=z6b0D2f!h|!BNCiM{@2I>uJ_AJm)ONE^v-ZS;VC*;!+k-DN}S2u4NI|vWRP0 zM75-+xCQQjdv&5%04`TCl}U$w7SIEfrq~QnmSXq)n-}|`c#vWlGzSro;IUR*|6-~W zHd5RU3QLRIgU+BkFD^yg2lNL6c@FS*s6@2BoOKlISk`f@6;N6;9!yBbDN&5~ zy?7cA%tBm^m@YP#bw29?)>)ba%uvMyq+gVK%g-bNOKrRdWWtN>J38bduJ4PYbsurz|#H_`}D z%E%t%Xya5)TDKo?DI;9M$WeTM(v!G`5w2l`YDkMu@#52n&vNbp=Pn_4nd7U7>Gh=> zp`?-9h-rg&0ZJO>l18bdm=i@wqdAD_{f|;zNsX)~Rx_)W)egl)qi)~_RBKvS#2SI( zdl5z5qa~mXXb(E`y6%YaDo6XEPn+nE`bP)wVyZJNj1C5ec!!4dEUH~~)M{g0jn7r-~*3izHc*u?q+>n&EQE#3GI zls1DJM}NJai*cP}8tzlQF*laMn#D@BhoiBS9*q%jtz%r{7-}5z1FA8~5-S3zYYcUb zwc#9U8|w_ZgHq(MnOGmtpW^|D2O*{n4CNe38!P8{4C)`F+R}vatd%^7cQ-bfbJJL< z*0k$c0Pk{)YD@hEU?HGamaau*q|Gb=R5F^g3akNCCYrM$Jtrk%8`0Uy$;Nb2#C9P^ z?=M|sFF3&ChggrW9%bd%H+G!+Cs2U(31m$ZbgHQX;;Y2e-0rhmuu| zU>BfsKs(;cx}TNK1l`~uIKnaB>-Y)8wEi@}s~x|9KCS#CD5lrE6oT)?=kJlicUzZYzS_FKM67@XsRpgc+rd`qpgmeY# zDpopFw2?Ic2P&}vZ051;P@I7T&QJnpD6xn0e1;Nyh7t$(=YQfLCXf?{z)_xj97;F9 z4~hg1Qv!!6ae>G9FeUgfC9WWk*DdiqXacvu9l&QIiD7z(B%K9P4HWlFrgUhsILT)r z$!8(SXCTREAW3Hc8%o*%em*4qfa{#3`qG6XtT9%ub+Ux}sCjx`oBNtdw&MiXKiQG{ zomsoGc4y@?ku2ptoejEiAJ)FCWvl~OA7&lIIykKk{W%>OF?x>0R(8Cx6s z7>5|2GEO(XU|ek6YW&oA!g$g6uY!yMcR{qEQ$gQ?;RVkY%r2-eSY5EaU|+$hf~y5T zo3c$VQ^M3EWg1`_ZJJ=JHZ3#lH2uZ&o#}RAW}&SxQCM0yw6L;pPT`Wmb%l+EpB0`d zyjFP6Y&6T}2h0zeN0=+kDRZ59wRwm6u=%|Cy7?DNuEk}ETe@2YT1HzYTjp6-TDDsb zSiZJgv;1n!vwE#1)>3Pkb-49O>m+NHwbr`Cy2hH?V%=jsXgz7YXuV;*Ys;_|*u1uw z?Eza4TYuYd+taq^ZL@84wxzapw(YjPwl8gGZP#pf>^i&29<;Z$_q3PUhuO#3r`T)k zi|lXO-?#6vAG9C0U$WnH2uHTV=4kF{?day{=NRUwa6IprALK?;rh2*@AkN(?oRICx<|O5aaXw)xmUP1x<7Frb)R?t)BSIc(c||dJUu)Q zc}93DJ+nNEJj*=qdUkm}^PKej-SbaR>Yg{(>+puXExp~m1HGfY6TNf2_1=}<&EAi_ zpL@@FuX*qKGJFFz) z%E2fw28;z2)%bnUc%|$uM`{+jRiGNwfVp5kSO99lAHd7t6`+9E!0X@*upGPt)`1OR z6W9v2gGR6u>;Zehr{FL+3C@7Of%DZO6}X7t@8B}H085%fAH= z0hlYpTp8xdFjt1T@(A!4cpQudPlBhx1TYCa52l0PgA{&VZD3- zz;!wG9h!dtST4hIxe35>8J5eiT)qQfyA0cd0_Z>%z`v{r<^dCc?Lj+$?LiOlfdB}C zFlYfHAO>K4umrRMZBYMUI|Q&k*a>t2ILAR)9fZ|ESRI7bL0BCe3Ch7JFb0eT<3I(d z1h70f8Nlvf6_^d?g8AS@un;T)bwB~Hf!9(0;F}0mg15jLupYqj;QIh4ItaUiJHQ9v zj{uejcLUfS{1ey*aJqvB!69%Id;ws4@DzaU!M_679y|{&0$3mX7W^ZH<{G#TV0#d@ z2Y&)T16UrC08V-+6J!I}9)j&5*dBuIAuE9OAt!JHACN%^!1hovh=Mq130i};-~rGP zNL`dM?*x1>JOsl-FgygqL&Lxb@ECX;j8@ja<4M8Z&=fEY%mA|htPWKJoa_+n4!r_OggIZna4$R(;JAiyT*G6) kSTIg#gjcsKbDun-p}~uP(uH5uM7<(hQ6`d~H1L1_3qTmYssI20 delta 9624 zcmYk?3!IJB`oQt`-M5)Bw>{T=zrTC$X7-+$JtTxs$I&FB5-LTC$o+CAQG0}>lBxag zDoN?49BGn7gp?CPa*#+a-EU4LN&SCod(P)`>hoRCTI;>7_j%U4tB+pWZaValsX5~N zK-07wP0RCXTGdDA=nI+CH7)e#@~#VuTaFj6D9^lP^r&di#%MQdBeWqLzC^o~-YD&s z7E3hLp{2(SUG1SH7qvFc)N-}fT3_vIt-p4yHb@(+4b5rqU0cv6@N?#+F;U<2+&+=} zz1t(3^FC>{OI=Zr(#%}(y0#+xSLWL>p-6ebVB6-<|JjZP4(3$nTwTzVz3<1WZFRY7 zgRxBQ*hrW8p|^wWBSRw{BW1ioYyBeKt9R4?ruWb<^Yw2vr7&eQ7HX{mt?t!K9QC%U z^%?3(oONC#9vqWt9@`=3fV!WtKC@$Nw~mK$Zt|IY?}QE&?C_Np9LgCN+UA?$yRXn5 z`X%g&Tw&xGzHpbquEFcoHQ}dKTbNy&@AJ&%<2sgIrea1E*JJovrsam5=wtZ2x)~{6?x=ywFUe)H^rrJR7jD37U-Gr!q?jXx4;3^oPd%ruX8b=3XmTNhg!EFToUoAajm zB9#Pl#(H0PdA9d_;o!n?>IuG&RBO3MwFR%K);~ORbbPeu?V%U*-n3n2dE55yyiK-F zwzq?(@cji{EuWZMtFr=5)#mR|t@)H{TOH5Nznz`W-aFEw`jM8*)e}PcoXkHa%ujDs zGnSHU>sM_-_RR2msvrJNwWjPwGH+DQD`RBdFTYK`pT&J{3pX=d=GI^CXWp5!RJT^-dQR&Cgp zd1F$Q{!->3^Ovd_izPdMWyUnQMqignO&+4VG7nF#(?gjJlV40fsoVWKj0gQ|{jZuX z&L3#%rOnp%>Mqln;?ChidN_ZxR;9HqnQED+pRW~b<(^f>>v(n_@|Kxbhk9l1XzZqU%B*R;PVdy>yuH6(@?`PL#alG9KC*aA(Y>14 z|750VibH=g^Z1nb{~ohnoISQUS67t3U%6Y&R_=CGtFfc{+*$UE?N_O> z{VK<=*{hs)1h`}SJGRhTrj97qi^AlXk4d+4{6uEv)Cq3?i6YH2lFRP$j4Uc4+KaUE ze9au#&|;sq-K1A#4&BvAJ0Km;+gzlT6>w-m=HB$w^s7ahvr01;cXn1eFXVo&IxloC z&yJTnH)O{fTpz2k>tlDN8oMjq4QlLea4*Y_m$~1~j^B0f%#L@u4`;`RJr*_gSUeSK z?5Xg?vg4SiU3T2gGf*@4=7fQ)Sof^bbmMhR_p{Rji!|MIP$hw-PT(i5s%%0@O4CDA zIPXJVp1%WpiMgZby``B=TZ%NtM$H^*o7vISMGt4}(*v}rY};r06?!D|%ydslq)4mm z#oc;U_HukejAXV>kL!msC#Lte+PLG)OrN_O8E?M3i!WRpDr&=>wW2m^b^0Whewfw# zPU37CV@6$7+hY6woMG0#FVc#(YUbQei?$Y1m=MR^(}>~Bv>6i%$Cj^9_t9M0=l(IH zhu$mmx0&tw9^x%lo}=E%7@=C8$8W2D$GL1|BYopR8Lwq6Ym2nfGnzSkvh<9)ugaRA zUkd-)%+{G3^@dFItciLgX+CXpHfV_(WgFOp!-ZS50-KwqCYP1Wqi?v}| zv-T{hKdk+rop4^FoAf-rR_~?X;Jh~UALlUVczujMOP{AN(qGnF^gm5@QSz;p>Wi+!1P>bMCcCF%cj>&D@|)0qfHwece%Qm zwwm^Z+nSD=zBdmrPcuJieknZ3yxhFbyxq4q{BU@&_n`T#{S!-}#bK$kbPR8{^eX9U z>F1i{nqj%cGR891a=&GPWtnBY<$c#&%T~)S*LK%I%Rb9d%PDIsYk4?*+MQ!{M{=!( zwbpvRwUh4=_a*M$)&^^z(Cd*Z>%hy*HU*1IE@S?{wpTc5TrjSPs~Qa;T3 zw)+|Pa`$TM=E$Sgoz}zF@2o#t|F9KA7DraNk9rD1haE>fU4!R&dfU9Vu&u`P4_kZh zURzgNgX2`>chBRtt38X;p4V+R+J+m|w$Zjpw&}KeZSy=QY>(NVwJq`bLIqBj(a!jr zx7ORy+uQcWk|ljK<1>7Y!}z6-7R^OIN>PO*>d+c((H;#LfI+w!!!Z)0`=qt#I68Nt z2{UjH=HM-?##*e$d-wn!VjFf~7ygZXU|~@f7G+`4WB3~1;b*9Y{)*H11Aq0=VkTJA zG`vBKH;5IX1m$qR4IhGtU>F)P4bw3bvvD8hq8Ur^8d~rsR$&d+VFNZ{Gq!*ih-J#| zccxio>_;5O37o?3INL{yYcRuxJQSc9q&r>#Cp_>Y1OstYqXsFo!3F4mPUwP*(H)oe z(bDmrbb6yNu10@c3+fdgjG?#{w_yy%V-mmQIOU5|zBuKJQ@;2En1_e)2p-3L zJdH(Ij2E$lJrE~tancqiZE?~TCv9=k7AI|S(iSIeancqiZSjw=6Q5uYKE(kX!V!Fl zZ}2^S!hdiQzu^r2?4zBh!-5>NVh@~G2s_G9377hJ_GYbWpv3DW4kB8ZzY#+*9Jk4_ zu@c8ioG5WJ(ZqR;m@0E=iPMQ`^`IFtF^gzsJRA389%FTJ29L=(^Cd2jnEek7jxUn& zb3}E`^LSb2mP%YEak<16o}Yc-3Qk^ycjUl&qFTsCe1I)7zg^-^iMu53mbgdaK8gD! z9+3FC#4jWs;rZEAACrl%h-&rU;0KvIF7X$MCncVecv|8aqFVIXX04j6R$Ce85c5!o z5>&tiA42N7G@U3N>RKH~0(EG^91E##hmO+kLjMwV5wVBF28lh1R_1%5FZy91)Sh8c z)kAO#Mle?Q9SyZt((0ngn1VYo9cmw_RnNg(JcLK^1QuWssBg8ZuUhz0EXNA0k_Ws) zUzJfUc9X;pB>qdz+0v|~tEHyZQp;+oWwq3@T54G>wXBv}R!c3bRV~#^9Kl!k4nIN4 zRjtZoV|*HCo3#WBN^pLH7fcjN{Szge#G53_;D84K=G4g%iKD-3{_yWh6Q>*_5 z@>wR1%XPmncM4}@{8zJ<h=Bw#nNd zbxle=lau8^jS{CwoJv#=x)akei!m8W&Vj0{Iz~B@e74Ca7?aT?s+kSC7LB#iQKd%57fFw)tc*SDkM6HR>su5 z#)lB1&1tQsN-nHnq8@D-vxu4w=qwkjI+MbhOF(UFsBMkZwno)fJ-8nRVvt-vg#ImZ z{RoNj`PPh<@z}I<#!FOnR}Y^Isddera_qn7PM5Lzrqvs&+N(I5sIFxX)Tlk6<{pxm zA(k+H4D+!N&msLH%`2e(H7!_))mVp(_yAk59lNkcZn$6K0g0bWRJBzPK0;KBp~f}e z$efh9<|i3b?sWF#Uu5E>L{)p0($hHGtkp`bYo*4u)VP)!*Qy#*mf8wX*IMdY8$? z+Tq|+u2rA18c#$c)F-R%rOK!lGXt~LK%I0y=0Vj-o%EQT^aT9{GPg+Po@Y*dzv?DS zv0RR?khoIfDv9#>*1jX-brRPT)$f1pMmp+doA56=xQ(b5M%`XS9MqC9>5pU zr^dBX<62c?b^IqtS!++pwWlSXk$6_>U;7smJgknz)LD^t?u5ERiN!?fT*nTsqtciE2-%2ee?N^!cpo*3nnjZv>xqU0VHKs~c>WxKrXTiMu84k+@Id zeu)PpelAh%33b0C5|2szN}}wOy6?`7({-|8>ew)KvSI2@$;q-|>dwgcti-?0#gs15 zEHOu-?4MM=jAb9C)IMTysS=50^8KeOm>^v#2Rw2xAafz+qB2({b8N6woy^H5OY!59 z>cAZPBgKzPsvEkaL9XdVzpotcM}Hs&QUBBsIe|@;8X+gJu~OqP8M2X5cglI{ni=%f zo2cJ>73WC2U!vMmY9aH$eo8$C*-NQ~9Agip79q_hO1&%>$tFt4CQ7MIq;B3qRM}a9 zRWkPuQ9WQC*i0!lQ%d$yO7>Dp_EJjiB`e4GU_U;`5wIt+zyB%O3@No2)B}Gass|p& zNtu(qkdnQSl08r_d!SzJ0TxuxgX;O`LwzBn&h@Ii+_&B#(IwF%^{@BIgsQnZF(fe} zQR-hGmvNQEgv1(&vM1{6Wvupwx?fv~?Id=T*f}koE)u&*yhLJmi9Lv9q`m>YWUjBo ztK=A)s(zsK2hmsiNKV0>rWiCBlIuqp}8?Jte%&85hZt&klPM5LTd}=YX zARDiKt{j^u@ga#BiH{J~HEhIs*@*QEHSN6Y0~X0i&q;h<;)@br))!_zT(Bbje(~<& zW5vJQ^Xz_mjlHwIxBW)@IQvZdx18%npA9x45`tf0(OmMFWh?6R^!Wn;^l z%9_ibEn8mpUfJHVZ^}-W=a>7->&v^Q%lnq!P(G&ozVa8!H{)qz<><=0Dw`{xt6WvNt#W_mca>)x z`3|2W<>=<<>$u4=(J|NYtm6&G2abJ??;U5IMb4n}eCI{Z%bfk3L!6_Ww>$4~KI~lR zOuy=U)49>P-T9gGYv->n-BslBy5g>SS0~qHu7R$huCcDWT=%*jaXssL&9%<;p=+P( zOV9X7=jrHa z@C@(_^^Es4c`}}bo~53*J@0#Vc@BDhN_)%*hMQ^NO!p9;SkemA@=d@y`GqD4w0p-7v^ z#gRUdL6OmsX^{sbPeqnS)ov7>Q9BlbN>2lfIK)8q+ZY zvoITTFc**DF+7EZcovKC0$##D@j6yuH8$ZxY{Pc!#4h|Bd+{kg!$BNs($bN`bdKUn ze2*V-5~uJ7{%q0=4JO!-k3!f{igHxK2@lAx5kdq}kYj@!8|2p@zXtg=$ge?ujSfv| z&FD;r#k5gnwWP$gI(XyD<~@;9fj{ z2hohjNxktTNU!lUp24#qy~fK}3es!5ft6SV(rmngby$y$cpsaw1s{R58@sUwq}(9o z#z7nc88^td@g>sV(vWt8v>PYz8_wWtlNKfAQ44ZG+M|UiMhVJL0SDahg49QY2*W@O zq&}KJ4Z46#N6B=QOh?IdI!daem!mh>$I&ZsHLk$`Tn|zny$Pf{ItpVk0i-+Hh&wP1 zcVRkaU>4?JF6QB3Jc`FL9}Dmd^^ZPB=XtycQXYK;q&>O}%h7^2@fOx#El7LxJ&^Y3 zzd+if+pry^KFW@dlKSXA><4L&lJ@8^d;>Bb{Rtz1_X{-re5b-r2ldmpBe`C=de<0Yi;>)N*)S!J)+A;ehK9 z7aZ$~zz}dw;9hu{8brZ>ZJsiOheaKr#HBnPN(n{g5f>5US_BM2#2|O0r1R;U@1N&C z^Up{#hw9-Ucf<8j{SW|v06<*;xQ_iq*lN{5%ieo^=X!^Y%{ zl!>Gilz=&)B)Kc4FiBFcHg~4ZWbqvE2T8J$egx)Oc@Y>4@+{2*ORU=8fknynZ@HVh-rk4IRFDQn0Lem@#SGxI zkOK-pu}}|kfdTT9$H!%+UUvYsNoLh@alYEA&Qjad8nIkLq9KoyOfgH!wpZFJlS*!z z_J9~Y#1lfNxY8aIIxS5TPgv#uw-?yA z*`6weBC$2tCE*+Sh3&ZIq0U-%iR@N($@A^j7Q`lH)OvA}eVhD1nkXm4Nw!5|o6sv< zk{r@0AtrCPB2Xt)Do^cS+P7ITxMZtV)+_7f#E;HxMONP!Y)yVL;b?rE{H|Oqm&>2Y zTjfJ?t9(ViD?e5k#iI;ThQl;vqB2`4Q&uP&mA%SI<-BrJ`A+Fo6?K4`qsG)SH35gI z_39DzZ*Y?OPwQ0s91e%+_$B^e*-;^RDvNczzTv)HU!m_k-$Gxx zugdqiZ=0{tcfxnpch%S7>+=1eVa)~CX{I(<8>vmvW@!twkF^zAjaH{MXkTc5*KTT^ zTDSJfZ}SKI{rqphI)4sq^ym9y{)PT>f0h4p{~mv{|Fr+I|KI)xasLzltAIV=4-5!o z1;zym0v`mH1gZiX1H0iDfs=s?f!l#+K|ZJje-X?M76ji9ejHpKtPLIro(X;(>oDHdmT|GIyGX%)gpf%v)xc`7$06BmPML$eWS8NG!4tejQmBSsU3D*&8_-`A6h- zq$~0=Dn~=n*P_|c$)>S%3rU-TsWPxM0cZuChCOi@w{*prfx@)py99-|sm zfR^GD%mr3vC*WSD9oC}~yavTtH|gWop%Dn8GSb5gq17}V=T&|yIZqBV=eQDdi60B< zm{wZFrgQmt0Y8|>crJULAI25o4w!^Zyce(F7jOmqe*Ofg0&#dAbU_3ubc5$mh5@*U z$c)a7fXm?(W)!mmUPpv)1vi;B@E#}8TyP)V$6iptL5?uZ;7%M#%tK}@yahH12bgut z24L{#P%g-T4|tu)gFVbt^op6r4?#EC0Go}9*vZT+>1VwxYABBBf8GON-_y(tO8Q>M)$))m-ID@;-%;nN(JPmg;13@w0 z3%jWyY!K?WEUtkUDP-sIl?>({GtZcS+yIh|iHRYz4bSC;>}J1$UFH5-Q1L zE|<%}D!xFn+2!0dZYN43^T-mi2#;d#v8ypAZaf4J!>!~Pok5Z`1B<{(uG7u@8k&Xf zu<<5lFnfipwqB_mp$d;B+es6t2Q>u2!>9^r=rs47J6)2s9b zpa64AK}npXvzeqn$|Bt`K}>d$Fc)t?Icx$wM_p(Wo8-&cQ)B|rNQ`?$?xAbA9983o zsE!$i*O56~9JS%CC<9lr$4DW00V~LIegkfXTgVku45~>2PopDXe_TqoaCg`_%niJQ z-Hr_A1p9&?Mb6^*GyI4yB>`H(ZQ?F*b<87L#CG%3&`y2@n!z0y>7-R}bCr`2vo5a%CboPYW!)8aFiN|u&;%iuf zVJT0LWbT!>T8)y@4r(N_oJxho6QSv<7$(qSeEyI?ZDweC|YN^gLVe_ayOQuw= z44LpM-$+F!E=l7Gw)IPOQn|HODw2C`ZMFwiV*9J5#nK{nm>iY5ERr>9b%{r;`z$-G zvACJ6w`C~JwmK7IO43#*FISc;3(UCBHcx%jJaDqyZapvUmujTzwtnkYsmRtQKO>*B zZdFp{m^9UT%sR_DV(YOKS@Xq$?@=V0uq4G{%WJkGaoE%pOVXVGKVM+mVf|Wp$`Xgx zeKsO~A>XlnY?f#=?_Dm3lzQ6(oB0Myi&A6Bwe66vNZE3oCD&SEIVRo}`y{K>B^Jp| zrUQ*qjWT5GvF$KD=(E-;HA;K|+RN;#?HlZk_BL2) z@3Eh@581zVa1Mtf>X`1xb`(2)9(SyBY;^2!{LXRSam(@0X>*31F=w{3#QC!GE$1%h zVdqijS?7rJpDyHbx~96GbS-c#byd6Gay7bIT|KTduB)zbH+H++Demd+dG00d74CKJ zcig+(UGCHFzqxOFkjL$r?0MXi>nZWPBd+I&gJ@0!CdyaTcdg5PtE_=p2-+BeF z1FrWP-l^UU?;P)Z?-FmBx61p5_Z{yJ?|yHG_cL$5chLI}?;VYU4VtX!+7Gp-wR~-{ zwp^>!;#$4dsC}S)qV;J5+K_fr`_{*NPG1D>_Ql`S`T{zd*}{wn_l|5o^kzt!LEKkdKj|95}{e1Wt;R^Wxe z@<4T9W8l|;!+}2p1_FbDtAVcr6FRTkbgv%KAJHGvpVo8r7xWUnLSL=N^|$qHdb8f9 zC-q*vPan{S^lSQ<;z^2ZJ|)-x{K!8)?Q& z__^_%QEXHguNWJRokpwCX?$*6Fs>N4jC&y((n6C%>7iMn{Ls?Ss?ckpcSCzZ?V%%~ z{?K6PMrb@Ngq`7N_{ZUA!t=u=;g`d&hqr|Hgg*@ThEIkE!#Bbc@d%B$B0q@CjO0a@ zz%L>%Mb<=WBikdbk>5v7M+PG|BKM=#XfT=>1r?&TxSJc`Wj+tz<1WE=v=VPZao$BH=q8kjAgUr`+)P%> z*3!6zZX?G@JJ&C)L}%!1u$w!<;(VG=fLG8dtRzRJa?fpU5m-eH>9AT|ma!aj=WJ-&k0a2DYvcbD7CdAJ&`l2f@U+&xsl={#bP zpUl0=Kg0`J0n6l){EIvTIY44L+?(7%kiiVF543?pa2er){s0QN65k|?k6+&^}-opH%cYT$SP8SXY*J1I*f^or{kIUDCuB@WHU>} z7T_S~*n9L%7DFR^J2#z=pCjwdpDk02<9Vcsw2)@7MYs>UP%YBXG2u4f!OtKUQ5#H$ zv)~Lk2j+nkxBwQx7hwfl1t7a8J|WH)vqes1q9S_4pqL^)BBrw@_GdQ2{?5kOzu0fs ze)bXTWJlO>c8U!E2C%RetR$29^f(El400VNh@W32F2&nW7QY#dqnoIaPtZ!fm&^eg zDH6uX5W0YCP(2<+ySdr8fxIZhQ6JugV)#|Qi!2~_;Cix-HsB;|CMQujs3&!JG0T8y zxRNAC@|`*w01raoCl!PuQSYSv6^$A@u~r#F9JimqLqrVjI_7L5hvI z>zS`d*Ocs1Vg0UTeS+VsU8Vi1L64R;8$B7x`b4-yH8?|IpGxp0>o40*8WHy%r*eCh za^J}eN|F?-8Y3<@RqE_B8Pm?BU7=K;-dLU&DDbo-T8YUi-`oYNai*9I8-t#SnUkuS zKjv+68p{1DR&7i6F+@?1(>RAqxPiN9K|3Dc37%sRBY2B(OyCo~VhTU;+m@U;$Urt$ zU=6mQ3=vymIXgI1q6&v`9+#nU4YzO)adhG#Ug8x#f`U2U@xvC=g#}oMJS@X1$r_(w4wvuc#J*_UoAg=t#? xf+VCN9gDCM1t`R3kU(GqGYF7CfCK`2aR7`U(1tF&z%a%!!MCt1K1S<*>n{&m;GzHk delta 819 zcmXZbPe@cz6vy#z=S4Bh-!#T zEVHa@NNI(UU}Hw(gK1%rEku$a0t;JMEm{;se>SyfQD3PGAGqAjIp=q{5AMnLW3n$& z)+U6=7s7Zf#ParkL=SIL2>)PaOQ=%+TDweNjs@Lal`-i~##+6)qN3c@o4X2RR0rdY z#)TCz-5w9fgzk>pMwPEh&&SuuJng9)FB~d49_kf2qShEIeiFQ-r|R~|7Om=Qa)RIV z-ukC_#*8;|NaRG`i4(eq6&%j3A8+vY5maX7C&@@c}>Z(-Gl(6vM)5L>-X|Z{Sjmt*Au{ z4xkN(aSSPR;v6pG7Vh97C>Wl`EI#8qemlYx$VCAP;YR>rtOO01Q70u#8ZbA4222_- z>#-9gVUmQ|ibF`E1E+8X-RQ*?3}6Vu7{xdyK!fHZ%z#8p5;0$60bd-UB$KI4UtJ%lO>bGnjKgq dV3B}TgKc01)>)j#4ctZsS-yZ$e1i1<^A|j2&&B`% diff --git a/intl/tzdata/source/ee/zoneinfo64.res b/intl/tzdata/source/ee/zoneinfo64.res index 6833ece3b46200746dc95a8d4a6c4d69b94e8bfb..71128b9c023928d056982a0862ae78479dfb947a 100644 GIT binary patch delta 12770 zcmZ9S33yFc_r~`=L6R%EPHyJu=43PzF%x4#5JN}^YKVCXiA2mK2uX-aT^wyqEp1g> z)K!OSQLUnbs?y1HTD02gSDo9hTL0gX+wbxGqi^25-nI6;_CDv{^!#$)vMS%2IOk*j zLI`h=F2rNOwGbiLQizc9m%DeC4bnt^?A~Gkzk7&m_iDMXo*eJ)mN>75IUp&+xC-j z?IR29AJ)GZ*FU}@Zk*i=+!(nm@EQ9Lfv-fm; zLA@~l-Qt?b9mCNxE%@q zN$Q%oJ^pOsk;Hm&uQccz)YdVn{+A7gCzT{U<{0Xn(O`s52{rM*I`78XVx4jC#HPeuZ}3Kg^I>&jyn;@}{Sp=&mXuIGDkI)EtbP5v z39(^)!bXHmj~WpZlF&Z3x9zpqkwKS&ZUy}sHKW1xn8sm?g6qc43abv=n)p$?Gipgp zYSg-zK?wuG_J-DtdMb8#oze9+xqccvF4*ncrrvLL57&Luw};;>Z^hg0J22{$YwD2r z((&FYe$V<&_3r9-(7T^+N!^=ue~2jw`zg4s_b|Vc>eJy~zRSJG$5i^R3+@#j6g)I` zQ}879<(MbK6Jz!!JQwpucstuWF&AULPM8q$-|&p^;lU;0)BMhB{;_*vkNI5-UKzYG zzIE_3;R`iQYptG$@1xxF65g}I*LW}VUgcHC%g1HQ_78BX*Md*QUQoY}{mOSs)F)bR zSEKAHO}`1g6@D!E*O0m)!BKzt`-FcGk{Hrf8xhjWKSay--sbzf_a6U*aMM2}+TZnR zcC>d)$k2es(XCw9vSVbL>!0js`CnI5PG;t4M~VM$0Z-ZML=O$wXbXsVGI~nLGjVpC zGvdXF*8}!zr2)qyt_PfpUJ!8A?yxltc_rXZ^cuSsaW3Rkz+dr2(OVrhdkaUnqfzue z*MXcK;cs~V<72B=?C4#mo!2$n0p+&WbmdN+7^T$ZH}pf9=(;lW<={k7hkvT)cOXYm z6^ZVrhb@y{i4>BCr%A6yBGHvUBC=H@F`R#oh;d3wB}LJc2+>qYS9*v>{5vdD6-6|~ z+eO)hJx)0(8o3USNRv(7_ePAZGql_kAvItN*bNSX6W~4YDYyylf_tV2^#MUZ1I<7O zkPfoIC@>Yw0cEcJV_FA{;_?_Hgi_DCMb>|{zK`qPn5O=F@xQK$(BtqM?lxn+r2qRA ze?a;f{@azFmk}PIim*^qgoRVp%L50kY;f<&yRHNz;%W@`5VjBg(7j=TyRQE&Q-r6h zA|lWf5xv|w)6%5>P>RctDqxp;*Yrho{hz1!w<;pvHAUoKu4aX$0rgE0)c^#mA}SJg zx?U^%+P5WEHr8m@i?hG>oq@Fu>v7kXqDB7CQ96KPz(-sO#SP^WSO4P9{%5g2LjMH* z%(bC7!}k`}cUa%MZWcH6U&nHA$tv}M>I$1P!T(QFMAuVAH2p_AT$OXueB-bhVl{SM zoHHT3Ev1eq-QXUqgaSH1VXmx_8~%e)bMVfC%Us>({_f9KMl-T#Mi%{sJAK|18U3Lt zoOI!2n$8HSTMOD5WYNq_SJwSi?tu%|%GegTQ@{#B*T7GCLhHb(gyy^NEo`6!9L2@n z#i*)?35A=xqn5Okz8RQ{Fss}-OSj8_jT9dTA0uCe@3`xfZIf}DG=)|d^i+kG0T1_d zk_Jx(XI#lO=Uk7jcDnX2uLz$>#B3t>!N>7hljr#)9&=}{D3t+BOuJ}`*aoVIWzS>d z-DbHEsD9f2BU8kasqrjBd?WYWYM1m+rMM8O6s~dC zJc_i7;tiy);XmBTHAsG@Na(AIgh6ng`}|`WitilE>zMy_Ya6CWUms3;hA9$sv?Q4O$u_CZH`xbHOv*5TU{?caov}JCw+iL zGCuhr8I!)l`rdu>$#})ey@uJUXqXEZxP!J`mcA=7nO4KE-G6NVOZxt!ibju^qEWH? z-czB{w-oaQOv4qmbFBYqO7Ef2exnPn%AIM^Ut%%MM&Ag*#U;dej%*oN#?}?MZ}0rT zEBII3|20M9=T*^|6>WTluvAy~=c`;pcVF}UNfk|6nxaWJck1)&r0*cib(lL`7x#?y ze+7%oYw{*l%JtikGTqo6ASh<#K#LrC8+@Xr*p>RVybwL66fYC;Q1W=-vDKg0IbD)XhY~G&0E?^s#cEYa{Y#o6@ zXpTGU;Ee}oyZJ>`v}kCG7OA+rKoPjXs#mzP4%JgaT5vnJV16xF?iQ!<#ctYDS*B|d zve0$q@D$(AaQ$V9mUUhIj|{Q33{*wSNKB`D_Ys?yy=4>1htZD0rt8FO_kHiGBAJNf zB=?!uFGyQ*3ib-@&F)>t7kb%~xnNsyzFTF$1@2~VUX%7#Ybbw;b{W3w3OhC3mco^k z!l_LObyc4lX-|o#*bu2H+}!ocsevIWT`2p*uL2v1D~3n83NMAZ%g;F!N1I{9j06VpELfY1 zuKY_;?zhOZfNxFFHb@n1+5NWhRO?_>J8)sLbhPb=RD^3DT!Aa$L5npXDbn6{E80nX zr{N2(9T$)L-==gAg_*aj>(0N_NjloG9qoFlq8-WCE|(Ts(t_rCZC8$~*(cZR?YKwV zZNQAH=1Z=dH?}2pJVNm-5}kIuNNsD|9%oFA z0STbY1@qjyZ=O~H7)(c&yVDd^beaKIyUV^-q^;8q?02z0aaG^mZe9GHen$BnzDHx$ zB5Wgr7Q-={_LQct-%;p#?VB<7&URCD=AQ3N26Rq!HTt%vqjNvZL73KDW1l(nd7kU; z?+aYNemgCs^JrY9xT-vDK26h3SIx#vF58_??VX>%#a?v24Bv6zz4N>Dzh{cnfvQN& zhNroI`Oh$EOI?C(V4rs9+|88HmrT(`sG^HE9O!BIIU0_koNlGH`{IuarM*j2{3L6a zVtA!{)Xyo>)T(ezS zlWsolyg%zH5#7R6(X9a6%6TjI_pwH7tuotP_SZ2lN4G8bc9^0&mvwh$(7nu^b)S0O zH&Ev7r~7xN=pm_Rt?vQqE;I_IB(-~lTscmwe?{DpC)j*L|N z8BNbDRrI9wo-=f`|LC*4A1AV(b}%u&$ODSKR~W`xM26ApfT0D+{qIW0k3D~n}(@KO>tj|iY+V~?xc9r(t3vn(b$PK??q=(6)GWGAsJ= z#q2Xqzv7g8lKRY}T#2>@evAs%;NGVax4K+J`H@X~iVnK=>#dBdG4iam_j!guUO@VK zo1$-waWGcKDYm}N5on?BPQ#3s^%Q5{!=~uRe)nU)`z3msy+D(tpwg(5B$Yb$emtN1 z^&p5<&1|U$HIWBwncT#gW3eae=bOkew#+%$rP#~$4o&56&df)#S))vAHzYMgO7r>VX%*Ua%j04z4heRmO=Ha*vm@KR0auLQ@QgRKj^RmT4V4QlcdBAjK-mX#i|&{um|b{ zSxb5nd_iEjai+a|TX78Bi}Qdf2DMbhpw@7Xv7?jxP1*-d#bA>L9fvRJyHaI^?>Cr# znIcQ-ZMw*jwk&^DWQAf!7@NCDr((}a!dQ-20dLpe>LzTFTH`=7jpQZ2nsu-IoDci*4OMf9Ui3$#eGXN6^RMUj(l(axx{?diF+ycM(1_4)&M1 z(*Ju? zYkAV1y0qk;p1egaHa2HThqULgK11u9VrVqp?t0W!8D^XxESF0A(B`PK@D{@>jZxWh zptKF;DKYc|gsaBE9JyWkey@sQZ0fLH`lw-Ym3>$)<*{fJ;K|0_Ve$zjVi+kh>~~Y- zhSCQqB7J}j%-45~kaHcmiTE0WWL4zSSZ+JL*+@CinVX5t-sD=D%?zamw|M7_%Io%YGNK=gB9d%R&Y~82U;2oeN16ZUVE|B9R zM(x43ml&3K)T_j>!7>o?GTIcfLjLcdlQW|OO))yjFlS31wxc^BFyhe*jHqHOiAGl- zyo+#Ee{GJO;rjz7D>nMSdUA>E7cs_96=P^%Ot5DV;dGKtCxOO>5;_5F{?Gx}TQa-n_Ps|3AHF!LEN zjs7d;YH1tKhobSh2vZGnm3#t$7pU>a5k54^D=Rx1Hxu_Hyw%vXPHvO7 zi9Giv{$PqpQt$tmJQ*^HsZDB$-L7^ZGL>B#sVA(L7n)4!jougk6u1C?JsPhIELK4m zu$=gYy5^Ff$4y#BTqSshIxoNnsbi&0Jm^Z?C_QR}oNJ%-Cce|ed;niCc5IL?8GKt6 zlbf1iGHpIclkU(6qt7N8A{~6}u7?!vFb zkK?zdkU>j9AVh!hNjcpy(UGy(nfPnu#zA63lAgl8GaFUS#V_R1k4`81P11$&xjw!<0P2>te6`I|j|9y-T0pKkJ> zH}34?9nY43R24J3nPTQR-8>*uY%@7*GZ$emF{0e^X&Ew;J9Xv<2w!?y97l_@^%o5} z-{}7e7hz)4LgD=x0Y8CXO)-lkp2c#_n(V1Co(hHfy+d-nbJk+?Qcyz-CuWwl;|l%> zV6H)b$<3TdElyC*20pgEMYHyN^#zWJ!^Z{(ej z%cZlB)G2(`6tnHBm>mc=_S7h#M#-j=a$AepU68wjY(jG3(S&dr2+4nWU?P|aiqQVo z!2qMjn{t`#Iy;{lMc{2}zYBjsl=Y^-!&mBH7jT1v;BW8`xc^{kLXn$J$tvJt;JenUR;wEK1q&>J3?%&Vt{*V?@8^@`zernr`q(t3I=O5BE zAxbUr^ofVWM9OGK_CKUGsnuTC@sQTCR@++hkk+PFTUYjw*0EMwR``(C)zbL7Ql)=> zYDbt>D^~BYB#+jI5`j-VJeUEs+U^tZzi~q-5qIePLt1XF_LljOHmX*O(*D&rB1N1t zt8$a%e?>IUk?PR>A#Fx&T<@%hw8B~~C+{Jxq*fbm`TiZ?!dk7c%#u8lv*zBGj+fRv zB$iY5A>tKq2pHf9dpRTC|>Un(+M8F686-{L}Jdd(k%hhgDH@ z6n@hfb;k29RUB!G;%2q=-+UX&lQ;N3`xD%YA66s(3acw1Wm!Og01UL<@f$#98>UkGW0@O6GkdsCG3Hbz~r z-tS6sF?fcSaQ&7Xpj8$~z776kL|v2zq_c#aC^>D4xph=A*BcJ=1Z^bfjB)3ZO!2bM z?SO;#k+~nhJfS|5dz6TI^-VFaR2B19z)yKilS=S?Q_S}Q{55C(BKUFQ20d6Aot23;e!MP^Nc;S~xcE!O0zwyr8Hc~% z4sy{VGx(Wb))cSIZ|;h*^HANUdq}mb$VKPgMcq6*CyGa-{f5B zSjttpv?E}xmoko})kfv-JQ^aF^7_5>GQzi>E^bi!7WheL^j(Z`f67zRQCim&rM`fN zedz>vq0!+lUbbwdk0Ov5rKWM_o-CEtpLohh;<9uj>mT`*w3p>zY)9M)8?U4*gQWk5 z6xq;a40@Sr?2yVVXajHB&53Zf^ zbUneY^bRTKt)!gJ$_LlRD1L<6^)kEC&R#wmowY2V08i52vMc>U%4cJfh2`9AR-62t zUnouWga*o&P0ClHbIq0SB<4AIA2Hk!f?G)3Aublgfo4Xss*F?|iV9UP z3|EHODpD-#AU(*JmV)` z8K@UVD94g2Mxc)Z1;ntJ6-zvAS@Y}!I)frTCsLX0tl)a6*a)5^c02sEr@a(nQuR+G zm4WsOH~Jy`WMakZdYdRE+xh@kaUSU-_>#UMN?8+riz1(rD}IK5_p}m9E8X-C(Mpk{ zvc4%Q?I1`Mm7#Ei{#vxs&Q{qHyES%O{a&;(%vQ-mr!oV(uRhADbhTCHVn2dCTHobV zHrXquQ6^0)nOWsRy-$oX%vre}`$_C=o|*Qf-wZGa%-3IwQHD4w_u$_LUMALnkLa4F zWLjSVS8{kOKh)=7CSIj@9q9(l74RUzc+@Gp;VAtdv<2M(XF|yVL-jdvN>6)LE-|Btod9zl z;*`10DkfT0ioJrm|L^6j>M>(@yprPOtlFfC)pWReSZ&Y?J7BWadUaeq$=ID_1+AX0 ziZx!QSkna8|9hod)6w{&F+nM7x)SsWLI2bS73aa8ma6?JQSsq-ylRIrs=3m_%UK<& zit2r)sQ$P%Xk8inZ^c{2?qsF4SM;~4Si8a$Yxm%xp@&}r*B&wcXw3*p*B(>Fqb$Uu zONl8hiYAR1*;c!8Xh9!N2tq zG!a$jfyOOhRiZ*vLqO+NCs9vZ8n6OS>hHBzB1^AfIz6yLe$hm9B(U0iFb4R+c+mP; zWw;8wqX{QXJNIfLrW5)J3zTcXpPJAnVfTQEi>2Mz$2Acr!8GumCgR(It(quJpuvQh zwUraS;KQJ^CKAVj;{8fmdoG zxjEQQ`H&`Bm4Uykcng|Hae{V$U25G5Tm*k>qD^0LRTFJnfc1cKJGGQwz=$#Bo085|I0W3hb2Fi+-X1uJ4KKWpqCi*6Uy*LUq(JuvN zW|{v>F3a|4_%lhu%(t)^aDP^5z>r$sK-I&~YGTkMz)EmtpXCE$3%UGYd|9-mG}B7O zU{2y-GFxfJ31xJHna$uilnHoXpV7pS46siV*{neJFz_givI^O^HIdVeI94HNH#nw= zp^ZQ_xQ)&UlChc?#^5A<$SxMJOJJKOay9lpm#oYk1sG-SGnyD4uZfYPYXe7Z)x@Yb zH8HvsSPs5Le_s=0*y}M-;1$5Wj%^P{;$wDW3t=aGO%r(%OvmmDZ-zU7hME}X3+QiL zX(hkhh<=(F?*obfOFE$^pn~`trjrS00Qy8Sdm^)!gJG@{>CnU^@?=sEz%iV}v6}RS zCMNd-8^BpjOkto?IC3%^^rpN6oYcfrR=iX;rm!3b6{c>|#I$;~olcuY`D1WL6Vu7& z=`=iJnI`fB09%k>L>-bde?Lr~%$!BNx-e}$;P26y;Vg1x79AEewrnt!GVK+VYoaia z^Dk#m=nM8}Vs^48XfoxAl*fZ{l&!s-3i3e#m_R4*!#4OdI8bW~>sIE1l_%i~fch4! zeHY8Y7vL1IP8)*}7kD%XD?=^O1n-iF3_`2`)?luK*C`(c`+x(Rttj$>S*;?HsHg!5 z0^xvtFCu@68UZe;q7*=G6s3Y5o;qwnQ6|U&r9=5e#ustj7EJ`x083v)9u&<7O8|*i z#GN2Fd2k4OBV~)XSPaBBT4qKgD zN14W#TAdKTbR+nS&d8rqD=%);>ScpC|7Gvg8q1<#DlJ+`xW9 z6Dt_-ihN+@#Bs~7iE?ILog@p9at2%dWlLtP4(QQR|mc zFtM`K%1mxL!7_@+>F}5)R+0}ZS*n#kQ=z{mRy_&Gc7-HbWon`#l=5J>1>j<-7y>H6 z3+SC-R<7cjCMxRyw$O^LWcCWTXeF_gNWXUT(1$PKwCQ1iQRQZ6Olsnc| zs-jXAt5H>r-5;=04?tP|20jATR;8j_tHGeExO`SW0;XzWO-sPwtGxgZrfTx0`ZBo9 z{;%a;U;COS9$i62>r9i)f`&wAU@hl(z@Ayh&)UNWkKsbtTIL6f-36hAP#8 zx;WaZp`{dUwWWMio$A2Xk+yX5)&F;r+voAu=k@OOuC@2sd+oLNIae!|TP`fItc!E5 z>nVir0r0y1br2!gQizcGucvpGewktbc6X7(-x;F6dxhLvUygOB`aagmy*Fh^Xtzby zi^?74it?NChkb-^Nc0K&Wa|~{x7ObpC=DD9oB^kzFNTKr#z)-sZDpV1+a=BsaH&DF zfNuis1=eejs#ds)vy;njMRp1t8aUDJ_8k^D%XdO#R%lA#vdGa%canNH8jzTn@Jiyf z#BPoJ5>6)GPx4P3kvOx#p3uIbkNcK1IGj)rTG-${`#W)ok<;xTH@Fy=8b2#;klhH} z7`Zrbr~T)^gORTImGRpGPeuO~c**`x;5Ts-{A_Xa{GtNyg)RtP9lAx`P#(Hh-R-nR z?u^uf>P5cqRD*(@Z6mKm{^*w+l<1f0%uM<;ZcW1HNzD>h$Loo^5`K%@;nz2)eZa&9 zH~oeujZZ2M80sA1SKzxyJ>r}e|AF7^pk98L0NU;||BF zaUb}d@VgM^?YtXwD(+@ja9C3OpHc1Oeh=%|;7)>HSf8*FVN;`e$9N|s#3&Zp4I!l?B&}9Tm1J?774f@eQL2W12=SjOmilIqbF2dQod*i@itJ-&C*A z6)|{B@HR`k`uFP{uJ^8`d&43h#m81UZ$@9TO$ z$BYmACAhs$Zo_vR+rzyqOMJ$~%(koz?iC&sJT!J`@I=S!G0VdfW1dae7_&FLgY|68 zJ296M9*emh-aCAF@T~AD4KKv}9lJU9m4;sgFALrn9~-FM?0S9(Vj0d(rZ2)G4){YhX@6^5x)f!jA^u3#k_p9Q9wD zZ}>+ci6QOP-XXngA?o8kTP!d6?6D<;8@4u4f4hvFXyl>(O`>CLRhH`!f&MAB4IvXF z5<+HKzVq*G+wPwm(cZStb~L)R?Y!47qJ`H@ug|;(cn|XqvA*Dy;GN*r*sGb>U$M7c zJ%(guWd+Q#-S^*S_m0j8*=Y5TcqV#i$j;aYR%gU35pVnNQ=jlZ7IDM>!{`G4>-GR^ za>zmdAEM{k)rb#6PWk^GpC7$4z-n(15FXGt`Z?E?A>G6G`uyW-tv@p$)4PM$7uNmC zZLg`y58g4#B3GNCAG_-1?h8&9-u&nA{2joNj-DtE%QQt1jq!F-Ucer! zydx4_#)u5r*q!kB81JF;4G~fW)`Klz4>$zg0Uv^^;9Kwu_{R{TRuBT>KnsuxGQnVw z2d0AAt}A(M!$)%6j21$vXWl#Ozg^#FkLQmoYD}{21>)Qe5vs#)xQC4KlD1PcZy|jT z-*ZjK?;UP&h%i4xg!wasmj?li=5n9RzoGa?;czUC(yi5aDSK5z)X9 z5nbG+Q!=D&0L^(wWx$ibX;=2T z4_&XVaJnumsSck=#1tZT!8%@Z^*zBlcX4I8^k-%2c|*kdI7BR)9viuTnM;PZqE&># zY+{#sI%UG!8Tyo~r1~BI&3K*xSBSa>|A6NkSCi#?Y|;>MT^%AW10LcwmX}N0WSTpW zcES4kW&d^kcXdP8*j3wY=L``~p~jPhc-8G#?UJ^3G-n{qfot6R)*wAg^BU3(_>Mb! z9g?>p61qD?LT`Au`_7ZS70Wct%b35o(>D}I3s*rR*-6ZH@7p*>T1H_q-^5p3t+ch4 zBUm3{U38t%KC;|&h$JsVBsFwz-5jr2!Z6D)H@eP0eZ#`MlTKq%i_g^7V$xSw-?+V> zjaSUlYn0^>jRwI5?si+QNy|b^meuHnJ8bLU(sJJ+8s`|IF+0CKR9fa>?!esZO4~8U zc8u0Z6vl6S*0p;_M)XxImf84AA-L6q7{`e%2Ni5wk=yr$kGz6^#LbP;WSc`Y*#%!D zEX|ew(sI|V-CtO~bBLym4AHcsd(=y7rKLA!HRfj5Z+pgAUd5vBn!e@Ee{GudHSZKU zkI-UU%N*Cb1@&DEH(Fe6_NmsUr@2Vu4Uyd0HEQ3t)?|iBF2tOrZB3C0?&8<$D*?%s z2sdzi1^>-BDX#NJuDd24Sdr*&h-Up9q8VvvHU^J*jTM0pSw$p>2c_E9dNRn}_+V4T z*=#z2v%qI`qMDlBBiJm|>CjAfvHq2ewiu#$Lx*TS1}?>A-f1P^CfTWS7r#+o32DyB zZN7?_Tku1Cv77ePRA}kZve@m2zgPwKb=qbr$9z*DGfpx3?Zia}3gWc%m!l{edB^XJJxu ztrs$BbKQ$s)DrjH_g8pDv|fq6#v$5tG(;Q9q1L|y|7v&C2eXxsHl^qsmNs7zbITBI z&BWNKhcMUikH*A?J4D+?sLfE#ZI}&~f>jJeq%z%|ej!OFwM``^9ZVv=5H{n?k(PlC z#La+5xz=3?bHDI$fD+Jl4KeG%&%~3kb`4#tu0*-N{xnef$6<1#wqy6(jig&jZ8!DO zBpJ}I1dY43-Cp<@zJyxezRwhCZ+8jpFMJOT(cbDhe)*V9rPa_>afSo=zNEhDsK1l9HV3qxG}uYO@~zZ3ZqZmOvLZFkDG4`oPuZtf0QhUj3HqM6+_ z;IKRD`dJy#f$VkQPrw#yL!J!)IN`zfHBK7?@vS z@`AgyB`M{uAv#Hi=)^-iHKez>ZJU`=W6%W50<+y`Zk<;AnM^0r-RXJ4cfcpzTfbAJ zwG+2;s+S>B{amkn|9osDtz?vza61MwbMPD$R0hXv+Ed=srEV>Def~q9J(bUq)V_pL z0;#30K0o#dNL_+ijcG16cITn1`7X!b^IX9{O$kZeh>QCq^#m?+&}~q(Yv0CAuBJa< zv8R55i@oR^Xo$`UZpWS9Yj5|?RY)t5wz-3T$(7d52eE&~e&{a!HA_a@43U=N5NX}u zEYH9%GO&|&PqVJwzx_5}+SA74r&`lqhTnECxZg%v(>}tce7ZDnAO5|iSFn@jK8NT+ zuDkq)?p5__u@ySM&x z)GMItMSNEb(XHAcy0L<8hjm{4bnM0(G(FlO(&OPybTpIkI-Td~>%1kko&Fe(Aq14e zD|BwYfr>qSGsd5Y%(#2F{=i2@DmJFmy~ZKBGko_Q8ro0Vn)-6MHnoBLJfiy>hUgLC z5IsWSmY(O#gAeNY4P}TD(4!ZQJ_JwJ66m4w~V=K9I)aXmhEhzzzOBLUs4sX<^Y zmj6-ej#2AQ3#FMfuD5 z0U4a}3@)S$3MZo)Ua9Z)m#Na8@ifL6#B=Z!?M{Gv&zkXrL-cH5h@L^(@jw~cYbs+F zg9X663^#(O!4~ieI0DRj;{x~udlHzA zzhdv1jd2Q*Y4rR~PY;#HYQGkGWf`K^7|l0a-jC?T7f7#XuqnLSN;pY=mV)JaScL2< z?Y;KnJVem<@SpmGNcomDKe;n=43Syj>GU@I9-ZcDDbez(J##+3MZ`Q0@77eO{4gT( zF!p6^gIKd_&Jw>8UgFAsxu@PgMs8Q^nLiP5*CBe(F+}gDv=X^A}~UqYlj+9 z$j&}@4AGZ;@7o(5?HToBMqC7{^@Ju;@wWG!g_B=0B4E4iPBy+ymz zT;^H(y@IV{zo`vxA@4i;y@yS%`rTttZ%_)(fU7J!N}twJW+_eT8zQTLLuAc_SL3S> zUIwp%y}&%e*OrTJ&<%n(iYYQli5oB!$8d0fAf`RwBZAC~o&W}cmHO>e`JNIm;9H#E8De08 zLkuj0SLw&Q$otYha4QCTH1Kyr46X+F(p&y2E%hAY zu`z~tY_^`=S8kHl$Ce_TM!2Hi=_h+2a6ku>w!zKywEhecGPoN8J2ZGP6Eu^3AN;Ou z9w0xo4|bt%!taLP(n|+Q?)SkTI7E(@A#(ini-Y7aX-lL%5{>8P6zM6C$@S8i!@0_(02kUM|oN=g0tQ&mliU zG7K?fDBg4}&5&XGogs3Ov=5nx`Xb(!;kWe#xpJVi4&ik%)W;A*gY}EUA*<{|*V5L|xCw@C(H)P=r8w(~A z$6&cdTK~~uiW&gBfUpetwFaDD^Jm<~`j4X%w60e=SKa)sd0`s*iGvv64kvH*uOAIL<`3o@${s2hPhs-2H zHpLL5sF_h&aNeO=l9%qNVr(Wn>UBMBwpl}?jyc3=FGGwD);^yj3(bE87)`=Px6!ia z%6<`}dt%dnG+SFchcKRz!7~E%19Rm#C1CUjoMdtII|QDFZ)%OpWTt&ID;xa)?V%y^ zq`sg`u9U%k4w1)+$eZAqY$O9EXi*F0{D?fh?eh4x%d3Q|J^pAO=G68rB-?ppJC75R z_dL8!f3Q%#C?oRrBK&HIG4(vNlXOrS)LT1JF6V?t;)(&3%9v!h1!3K{{b~EftiuDF z7RygU#&Cg-;hAGL;xiKn$$0JdV)U7u;J;G zOrOtbx7|6%d04xUC(meKSIhbK{9g#V=MZCA&e%@+v>LfWTF3I^XzW^qt%p{~r?L5r z8q3u-&Z57tQu4zx+#$w|#C}3gTWy}Dapedc`*A0<4Qu37>o`9A#@)casrjyzJwnF) zf^81)XWewfUreX1mcLeZv(+=icwdJY-vGAhudL;guy9+CXJ5yU)f+y^E#e$M6X9iq zH|XyTegJnEBLQ^OD%Q&m_VMTNUm)&N_>z8dz1$+L<9X*zXk>^9owR8i>>s*cc(KnLhHFve$sTpBJ{=hsfY=?@bddGD8N}cZf-y4Kb;&XOJEY;;-#{R)%~1 zn3}Gie^yq>h)Eo%Nu!9|0Uz>2_GF5^v}s#p59g#a=;!c%1oO79T|y=!1%hDh{1!Pi zU=n*di6u_reK3g`O!`&t^E}H4R~(|Cw;>8fc>0;kXEw5*{@YewAQ1&qaPotxfQJ{n z?s<3=0a;r1b~dfx1Uml+Qg9l6U*E9Ze9;w9J(D91F}bV z$uA=?k16KqGN0K2WHVoj_Uta1VGG0+>JU>HWJDy@Zl zeiW7=EYr5WE(eDcGE5;ARJhIaoMB9DxaPZG-nSR-Md!2@@|eOe^@eWwonkHg)gh+M zF~qc|HXV{}tkXDa(>O}g4(e%#Jd_I!xE1-jwT|PaHtk!5LyWFi)5pZk~g2V3y9HflBj#$20J= z=|vqKqNp33ODxGY|Hz5p2^zlIg*Tw14%2Y*0#Paw>XP7(`Ltt zSbot#I+;5*0Th54`lzEMHlXNToTm*jofpRRWVolc^|;(0F`W;y=~U44neco%o3ot^ zrs~s9@N$ovUV~#LU}vVA16=k56%sU)c8;dLDI05tkIMdf#k+EebWZ=7FfP90Oou4W zg2_?iCGJ8B!-*7ywK$sFdj?;CI9ac1N5=)$;Gm3@e6d> z1Ni5M5-&rPgcD{ZoMHGs5JK(%`+*xg0RIF3fQRNxH1&)OEoU!FQs|~Ue0cW`j8}9( z>sF`D%r_;E){_=-6SE)DIEbb;Ed3E}V4e1r@ragFr(L@6h&Eh^ajK}{ z_lQQ}m~k&}eMDnlP3^gLk7%UI)Yeu!qM4~fTU`8zHrv#Muse7@f9h6TRwu67YDylh zf);^KKRTIZb=vOZ@V{{@Xc2el!Xw(+I_;$Kh_<0li&Fp9%1QN8bz;+2|B7gyW0jKr zh{kT356R4aMB81b4at8*d$mp*SNw=Z6_|aCD<08w+U*e+t$Rc~Lfe;R9RLTxA#j+! zQ^8y?4=k)Lop7$zlCy*}gy&CPB0ttPpOv54OFqMYhsyjF{###g&hs%fBgYUkCe-zl zJX#*nqdt(6WYZa?IQW{Hu@^o{fcb8O<)`2V_y*ht_w`pk>~^96sUs!@vUl_$?Xl)jSFxUnld}>3J84@ge4I@IE*PJ^<+Q zFYveS_+BpZ3Yhl;!M_<|{sxDbuffOltv|_Mq<#JsLzFdkh_YljUEg}g{0&n!9D^_I zGL~3&R^RuFJR~E^J~zYyp1U9(ZqIYgt+@u3=@q{*lykuV9N7ds4Mn*)2`^FANN*@q_rX+fn-+f z)Kls!{C=-Eitwu;7E8UxN7*550S>Wv81@uqno?UPdbUN$mG;F8Q4isL3qGeGuqrDM zuNz{Cze6kug%kDu4V5)AWC@>EOR5o`Vhl6o_n=(;j!pSVI+whJgMZ6e!ilJ)R%_F7 zlAt@_5B-6k5-$_k*~*q+h(lD4geTPv#NXzh+H0qBf!5Ps$qcFF%cQcJnB{nQn9=~) zw5|S12Ycm4bdp*54E&t-wZGCYr1B+f>afytMJnOMH`RIuC^wr{9z{O^t`TzszQvea z65=-ao;Vf6f@D2APN& zk2X0{>20$bqN<@oR53=Czjh>2IcJH%?1tG#TNkAawpNkEDw0?=TKgeN>ENs?#Ga0A zzA3$VTu0Cs^aGFc|F)D45mjaQD~PLvmwD!&f`5RvE?PO7RP`kK2C$2mz3@TLSdy4d zAQhBorA}p%vx*C%>I3j8v6tbip7B}}(^>n&sSLDNeUJVVek!r*o;D;#$uWP!Rr4FJ zx&ds{4#X%c!=q{PGr2k$Zs{2%gi*R`!&PNQKy?OsCg@MhAb7C$xvF%qRu^CwV)O6G zu}ZGBnwL&>Ird_0L9Ei%TD=zAg}qTb8LMovS8tiyc}I3?FveHQyu?9V(a z?ap&E!9Xxa`#eq=98i4||1H43xK;lQ-__FNl`Qjr9M||5qQ;_az)TFL8HyAMM>CpP zVBauG3y=i{gQ1#tf|6xpp*5`u?Fe_$MkOd$?KQn=k4Gzjr)xbEl@@U|oPip)s>a+Z zhEv*sZXg@vfFat3M5TwlW-T!riRC=ha2^ts+0GgkTBBpXMPELgP9KLoXRPLZeQuJ{ z#>-jrp+hV$FvRjTxCnZAE9?nc{+xcMi5awfyF;w#Y={-(a1r$AC*6t?J*+uFZC1>7 zh?RbZSlOX2Xl6d_8EIuNT6BE$8*gPleL*Xwg_m>XAUfVM#43AT(Ao;v({WX_ex|L` z)+;*BAy&Ob%uPHDw7B?@n7evdM`lpI>b^s)CK0O-5wob6pBG$B@ehI3Gd{C>!*L9*pR1C;NOk8YZ@Fe(C6>($1Nmax*2OCvU9{)d8BuuR9obWfSgU+f*90qi7T@^`8C}~Sw zOwtwFOtR4o>~xrR;~C&h@F^M(ZG0Q1Zxi}9?E!X}Hprm;4oqyaxtL>Wxkz55ie^?Y z89Y!$^M$nz(W1U8T9D}$=1Q)rqGc?+6rKn!(>|z*R)G zhtuhp{-i3pQ&ZhvQ$>$d@SZ9%T7qn1*TB=jdhn&EKmMMPfR*+96U|UXugTz5Rb(ol z7`%?20mx|Pf7$=uFQ}sTXR7Fv2foEY`ua|VNoPNEk84x=FQe@OCxBV#OgM`y^8W1wbFq){JNMG8?`M`>SFCbuwWd*bjbH#l TfJ_5-`z8Cy3=9lf7tjd?)>- zih>E)joJT#H)&Ai1s|$na@V?tPJU4pQ|y4^n?f~DVc@B6sG^X#LbjlA4}C~qA?I9D zC(~Y}9~aX!#xnVdMD!AvT6uy87L7G+P(YjUijJsadKUIn_J8_f430zbWKR(1yZBk! zW~Y3W`hg2TAt(alc*uF!0-Lp9Ry4MF4w!YsYQ@LEj05Jri^aeICxLm|m`rWV^>UAR z13pV3wuF}eu5|eYI6~XJxn2VS*r%CLXLuvr1M~*{!DAp7P(LN+q*+ACR6uQ%l!AGl zK3sMsm7oT!2IW+Ii3Xkp+W@IAp$AG#Q*w#SCx2!)CmX zeNh!Ng8`S8G*nUA1S|u0vHwuTtno10Hams=pZ#rJhdIqWY_6IC=8l0shTm1iJb&;d z_EA;LKL_)`vH^fJ%d@IjkO_0H7nlz>w}8PHnhzm<;RmW%#1UOY{gj(^akEY@uU18c zQe0jeR57%!Q^f&QEcT^+3Z4s_58$$p)W_maRI!8^FX6(fG;89h>8H)AE7?YAX2Zn4 znRD|>*IjPr1*e$r1G9i5VPb0wvz)yZn@#XQZm^})!%|YU%USNl5lKBuS1e$&n;U zn&dJeN1>1$goL9~A<03SxH#%52yqC_1pATv4qk8@jGi>im4MGHvay2$2PzChtdpIg}m` zoJ=pT^=)K!;FW;0jxE|CIwaAG>v#Q%*SZCXJMAhg`>ySF-=H-7EQ0Ja$Q_FSf zYB@2e8*9hL{`y>Wb7WI$H^&y+F~=vVcR98=a>7fZ9nz23npxF$1tGOOl%|%ynKQqb zpWr@ozTBMOW!~alMqpe-Uu?7=_sY<3%(YqO`GV%M+&t@1^OoK)myOIDxYIo5SabV^ z=9WXuW41A8+L`z4nJjhox6GMh^POxp+KjJXYl3;4Nyg~$Z9>+#+Qwq8O)>9%AM?l; z%#W~qxzn-7(aVYWsSGB z&@;7M?H|6K@$sqomOa{-l&4Y##NSV8tIxHKbSz728akeqjIT?Z9-6A#LqAw+Ya>!S zr2RYPb^X_1fmWfv6l!I2g*@6(Yf`&MD~?=CX&%vnmL^(d>Oto^y}R}onXR%ziTbHuhP90J9IH0n=$d#cu{Ee=6maaenFa3FbZfA+d%gL3y?clGdWZY4N3B2X z$@i-D`QEOyZDv>RTJ!ZkAkG!9ouRr&mHea9i+PI*tL7Oj+w$04*)iYn$^W9;- zzQfnwXYIiT{kdYDFM_V^0u(XQ->I;8y?2t-8+DxQrhvo9M+x z-tXghs;on(AtuG-qeH5C|Jr{ALwHtaL*xc?V^z~ARu74>H_?^FG0 z%MaZt-miMks>*9}4-N*c%xf9HXInK#?DuSST(#X+95h~-u~Q#l-2cpYeZYI4JoBio zH#M3*dq>_6d=0MUS+$N?*Yea39l2?D8&5y`c;C|aV{xaoJf3eIADop0QlC^s`Q}F0`()&Wx_NZnqw^o)4^uZi?3U|FE9r z?=zRJz}Ck0RkXXUXI5|9OwUW6hizrHr)Iq-?f*IsvyXp=4u0*c7diq+2 zhxq)CsH3qXG0WG=ao*p-(bbXaPLEgl9&l{(?eab3c*Jp6{4qy`W13@@<8Ka!|7FK= zN0p)mB_8+@Lu<4}2i%Qfbj1LSMp=Tz z6PSpnFcs4<7cXJ~UdCel6Z>%xhjA3g@io51DV)KNIFFxDgI{qK|HTdH^|(;fLZUW{ zI&dNf`S8Gx5TdAy+t3h&Xo?ni60`6E=Hn$S!Yf#c*Rc&BV;4TfUVMf__@bU>{5U%= z@gw8&_z9QsAKbv7u+-N|>_|ZxGLVH_xZp(qVZ=}m1!#mOXolO-3T@C19nl&0pj&+{ zTGE|C33{Oq`eP6t!Z18+y!yN=F^SO>Bv6TGFbmIPE?&d}yo|+o70d7jR^n}}##&Tk zBR1m$Y{SRcg-@{;pWzU`z_I#TqU1{kC-5Ck;|H9>1zf@}xPsqs9e+T(O)Ig&fmEa; z6WPdv8$JXPK^*nb0P3I9OAEAls$&Wgw+3ZQ*qA7%6_|)AP#YzsmC_l~nbgAiS#*xf z&6CcTE|4yy{O;Bk(Ir?0weN}qgH=!`S}k28T_>%UZlG$XO>~RQZIgZ^-67pY)d_dg zy*MEAhh_cO#8EdmHfi zs~07_cmQgre$oNbLDbItU^)yVQHnCCiyB8KU^3LPrqW8NeP+_xn2Y&X2>!iMTTGW? zd4k1CRACLOu?btCu6!Haf!){(b%F!*Fx15!lOC6TMb$PZ=t-G7BRwlUCp}LS>L3?o z;*zvRdYP(safM#P4QLIyFsS`fsDsv~8OTOHya+;V6Q$~n#OZBlgd(VQEgH(_-%=)8 zQFTjO({|_twR17;h92k%wR0b;-f2HNNalt}he=0DM@dVm+Gh+cH^&K0t6(ruR!pHu zs1wYP&XmrQ&Zg=j=g@grAoGi;I{0F`ROXgTSID}RvH>C4 z_el3j_e&2*4@nP8k5F}jWArP0E3Z$}vp5fRS1-}TWfoU)9qQ_Dsy4cH0S>ATltR&O6x)G(|{JD8Pql{soJI$y$foa4vqNyJM*H8th|?&K<)5=w2!o( zbO2R5528abLgq(FOR4(ZFou?+0uwO>Nz8yc{w%Y6{vNvp61>Xug1P1u5MP$$|!)qcC^9+}%OJ&=&WA?ac15$Q3ic0Nu|$lOVpJ5A5Z z_&mKNUb$M9p=x!Q&wh6bEWxGx7173L4!1kdNSWY+K8&( z7lpJLTB0@DLG9Ox7NZ-~Mf7OQ=iieT>NfSE>K68+gD?ampw^9|>Hwv*4C9~y6P!3i5c>G7M+86P$yeJ)x|8LOQ7~yMps}J)HbWB zMdRmx4TEZ#++e(el{ zbGRrgYN*=yGQBF}>+~knMex5Und@yd1!^u`njv*cv!%II-GzMWMNsAwQ5nRk`kd?0 z1}H=`sDrnp>VjI)yPyu#fp$h0sCDZ{x^D=Q!dP!O%y)3;Vy(+yX zy)L~Wy(#74fq7yJRTpZbDKeKXO=QTxDb1GVO7o>|sb3nDhNV$yTv|_ho3sH{7tx3o z$y|#fe*V>DOD0;&WIL+nI?&EC*G1;K(H>CWkDjy-24FDMKEvopsP(0^4C62XYW-w7 z6>5DYoms^1|Je-YLVZT_soHP>T_kf$q)VmCq|2!~&9im&XP3Ct< zcS(0AWUz;-6Yr%5WbQCkCpbcn;{;B^{4z<;O3zXC<93nO;0mtc2GsUEOfqYc+Ne5T z!oi@nOlC-((p+i2)J@d|d1(+))Pp)f18E~^p|nWaOxi-)@>UaCE1765y-V6o+Ckb$ z+F4pG?IP_ay;oWy?J0dg+DF>YEI)q(WMU9iw`4FKCUYaDqhwtvEtBy$Isxk4PnJ%R zbyI1j%*~X}l6AA`T$!7nkii1!Lg^x^E@m-ZDs#)FE2Jx>tE5#_?X#M$lerDjP14QM zEz&w4%3vE^W=wl^V`5L{@ys7Hf6GjF`kY11_Rjm9L!4usmCl9ED(8pJ1I}-qHBM_* zPFB6FR$1M$`e%*Knwa%`*0QY4Szl!Rlx58hWZ$0MExUjA=`$+bw z?Ehq^)&|bFb#6=6Ujp@{02Y|H!Z73b>lMI=OnehPx_U&$wQ5ZE)>&ed)U3y6MVvhuzKG z#qJXKAonBg@$RYa+3rQ|74F1(_cr$)_fhvL_a*mrcZw&+6ZRB(?)2R4>ERjVdDQcS zXPRf8XR+rk&j!y9&*z>Ko(rC99)~yATi1Jsx3jmzJJ37IJHcD&o$GzY`>uDJcaQfl zk05^WYQ8j|$9J3Wc3($dci%u?sqYEjbl-g6o4)nF?Y{lKa4GO- zAR`zGHV(E8{x$eu@Uh_3;N0NS;F{n^!2`kXfxY|%JBE9Ohlj_7XN2d6Ukk4bZx4SK{x*Ced_9~J zaYb&6w2X9)^o)#*R79SM%#SRKtdDGsd=~jO@>AqSBsJ=dHi@>6_J|IOmPMyVpN}qy zu8D4o9*%w&t%+J=**tk}9{Wq|f!MIvO>BGYKqB^i>_0JEJSQHFw}^L) z_lQ?jHHvA;LKLAH?!cXBgSKdoPUwtcbU`=t!2Rfj-sp?|7>L0bf?*hektl^e#_0aK zFENGTR3uS}8JLM#n2i_kH@pY~FX3hU9k1d|yoJ?Ri)w7ZCTzww?7%13hokrk-{8BL zmPnpr@IB7r9M0n+E};gOaRpa#12_P>l`Pj1RCKyRaMo#6En6gZLa@;3$scD|~~K_#TNL zS^OIpaS1iJj4QZ`Yq)`%(CTVQ2Wq1ZGLegXco9Gd5%2&dSr_$DfJP`p5t^X|TGr+B zZ^fVuc+!$=kNeRJz0nu_F%W|>1j8@_BQXl4C__0aFbO<}N%9~jIRi8C9Oi%rGs$@{ z@Dg6G%jf?JgV*pnR$vvX@GjP(8XNIG{(%p$72EMKcH$H4!CoA|A$);j;3-e?YkY(6 za0=h!2mD*TgA3qsPx3OZ;5Yn^o8WOzl1DwsRHT8YJ;_Yuf~P%6H@x79Pcn!I;;4rL z@YE;S7)^|hZ|2zVV$|Lk`erQBi&1a%MSl#$gLnu-G2D3b%}}C((F9DyWK6+SBvFYO zcoxrL4(8%T7+46NB_(;5lzam#@eba_I#go=HeoZiVmo%?6Y#vLIQdTo`)~j}bV?q@ zzwjl##wmP{AHajCBoCsJ7jX$S;DJ=~it*gadz$*{^Zi5!5%9PvSr_%eBd26T6ru<` zc1qrE{ISwEs+dt1@SrJqFM8m9@T@7>8-2m^rsO~j#t`t#DLDcoF$y*+l|8Pk}?5Rx=8Ihuy!mfS)}lDlzvrwQ#nAt9l4 zq>@A=#bKHwM{c2_&?GrX?o=wtk)%25{r-2q^E~f+oX`5M^nmKJF6 zOal{py?WCIQJ?xKuYQZ39~o=RAJ-=7L_}S6r%^YqwC!o{!$~IJHs9&cXALubryGt> zIuNSz&GFgOu7=#yZ( zjc-%(dt$sKG4s}m@xOc2F)gBMxjM1@)~eR~ht%?@u9l-x)UvCQUQwtYGul=Z7Cay9 zYs>IAPTr9As=3CxGWdB?NB@sW)2u)Fo;SOa7o_&~NBotMc<^0geucZO?r-T|X)U+z zvAm!5ZqnUmbq@^l9BWNjt*tT-P8*+?`=>tjIZs>Eazo-y4>!(L^UdD-2FNl|P@yea4_k#k$>?KgpT)xL;lQ`NR{l8MTuN^f!$YjNg}da+bu* z?>F?xMfwh-c=8b4Z7iHztcQ%9lUK)H_S^N({Le+V``7yKG4)IBVw$BL)!cf$sU-b$ zIIQnYEznwNQydd5E%kIQOWW*uCps}D$Fx@)ojfJEJh~~lM1RimsO`1XVBl!#xafw| z34tf|pZyoi4YWs6+NWMjUap_@N3==$jKCchTfnUyHpjIxtySpPQC|Y6BZB>r=Lv zyBJlKrTSgQmdgJ6UA4}~`{<6B{cFp`o8pM8kx11jaZdaf7w`EmH+?t-D6k# z>Z+X0U-oy)`Y21C@ln>{97g?zbDB8Sb`xjfDE~e7o*X?=?`i*q@s|zf69KN+`iXrk z%~M9$buHXT*G6f&X4lQy&wgXZlnL&i{aT}u9<%nOKGNf0A{^Bym5c zo~&fqCzhYGH>fpgm}%A~7_(wiVrx0Ez-87-(hFR7(zX6OT{VgA8rQDG_Ab}wZngh& zcTTR_pOafoOVZ18*C)2u=f0oVen0nMV*6n3*~IqQTniIg>$iBaX-Rsvr*UGtv8Q!n zyS1mE$J~_z`Y~gjN3Cn`@FTaKAFt*7fS)v}o1itCz*Gyg37O6K(XZl1>=TYte`+~q zbh57fQ!{J(Oj@Je+^kkcUA&zhHqxsDEQ=G%Zq?oNh_S5N&`&eyUZHCe9sYweDoGI@U^J3kU?|5R>7*qAbXV%oUq#w>LmH?xfx_0!ArE=GqLt$Up2 z7k3liLQ#K4a0k?%5`Mit<4&l%p{hJ5cW1lb%(&L5KEteC3)g3;>#F0{V!N?##%{gb zm_Ku(US4Z{dX%mQjd8PDXMYjU8vUAW)=C|}W~&oQ)!!t>mRaL^^^NwA+RYC|bIe1c zk3@$@M@Gj)$48&_1Z_=iT?2h>cc%;vEcJYl^t5@ub-Pxi-LBoEJ*q9xR&eXjYL~R1 zwGJ+mo}xF^yXX(;54!#xdel{6R6pa44f58w`kIECMw%*2Ri?OUw&{#(fp>s&p(!uC z)bzS(MCggo8q+(bO{T4;G0t74C!MA4{ib84R^jueA54ACQ_U}!-!xAO*O+&h>&!=e z&xcorPkL{fzp$rSoR$JhTg%>X7fX9bFUutNboVgJSj!a4T+33+ddp7BN0xap_kPPE zOP%|q`{)DEVSCHw^EM2*U9F>ki8l4N^>+3C!}iu&Uq!XPeld_ za4U*&8(QHGl%p>O##lUp;TVZA7>{X)V>+J3Z2S{jupK+`0rub%9KdHdgn!`}zQQS- z#RYte@9`6^;uje4Imxj}v21L%VXF%W|>6pvvP#-aj~P>Cln4RK7z z)0mBCF(1!k5njX+yo%*miPd;3KgJDXWdmyQE;eH;c3>Ai#9r*fr#Of&a0FlC1Ww}| zzQ#rTfXnzduHjeI<9Fz{Xx%MHLW3BKG}w`e9JrzWE4yETwm`MNbRe~`J%|p)aEyXF zW}LJ_I#D{An%G}Sr^r}LT1{i>1e5jKRx)|!%CDNtRWzyx+*Qq*Z z6!j0#*+=`rbX=?Up6=^3iN#5wv6zQ<);h5GR8)JAX6n`*3(XsJJA~c6Ow-s%J5|l!n+mWhoT1Gp|ST|`8RrUOP%0Mrw z4(>zy%laTXRMv;nQBW5iC#{f9luo8uIeFZjx@6Zjo-2?vU=J z>fGIQkBse;u>s^12w@5xAOcivT+G&Hdm;+;8l8E#_FXvrGH5EqCd|u zORZF0G=-+YA>-LnCslt>xTy~zNXNxwr9wK9s*@+vDjAz5{qM2WvOQfoQ#y;Pb7#|e zGPY1^PzU=K(4i@ zE80fZOK53R`Tg%GgJra{taqb5p(fZz+E4cNr-Ni{sB{=rlN(M)VVrDFq?MQgb*&gx zlbKFusSS0~Tsj{H)Ip1>I_M?3RK}Le*ebe4*4NP*sB<<-H%T{3w@9~1cSv{A#NYqB zSy3PMA^li(9-wMsb@UL9$oO%pjy*xo$od6(5o!{bWb87%Dr48BH>CB_n@#2U|G|Lz zFuj=HQKUd!EKQnD)pK^xY`EcrIwnNbgd#K_>N;y8G0(p< z8{NdHO*gh8O!|S96rH7=4rAMU4 zq{pQvq^G23r01j;q~Ay{O27ZJG3^p7YNnUzRoQu6dP7<-y(#@esyF*{@@8q0G)0;! zO_Qce9n#EZ^8267fSQDpdSqun#zHht#tLMtkQU2W3mI!g+d%z%l+aRiL^;&8yU-p` z`+L!T7#L$Q1nPicbOh7^V`v2?qYCN~O{3~KbN?A4 z;%A7)R?4yQS|{k=x*%6J|upYqz9#ksQPs~LXYDV&f%M8 z^85ci8|uVM(#uqR;1zmJ#%@UKrGH5E=6{}RrfNb~nu0Vqpst%ObxPe*Pjh+xJ{br| zL(+&ePns_+kQPddq{Y(a(iYNI($>IW9Avxgc{zW=-Y?nMX4(X5Pq5&GKh8 z&uSmb>XG$O*4V5$S#M;0m~}YoeAe}>q-=k7%k2BI2V_@dKb^fOdu8^>uy&kS1;EP*J#({uBTnkyOz0PYhCZUcDw3aU%9?@{o>Nyjoe;$ zzPq{mE_Ww)Klf1gIQNt8XWWb2E8H90JKUeRkGa2g|Liv9X6EMQ-j;heZzy`_K9V~= zcWUnJ+$FhdbKm71#b>#va(~Rdk(=bn@kBhup0=KHPhZbaPlYG$F+9sW>pbsyKJpy$ zob+6ddFnkWUYEDPd%L&X+uQr7x6(VyyTtppcdNI~`?dFmw}H>+Yv#Mx*T*;9_qcDa zZ<(*wx7+uH?s@CTX) zN&=k&0|FxhQv-7Xivw>4HU@SF4hBvHz6-?a11Z7mU?^A|EDiPu4h~KT#)I>MuLjoz zw*>bGj|IOC{t~o?azfG2ZK3v|2SN{rCWhjn=R(UuZ-=&o_J@v#z6)IsC5L_CqVQee zPT>LJ(c!A_obW5*wc+=}2f`=ASHfB(BNB?Vh};wD9vK)J6PX%$F7irbU1V$IU@USj z!fV8+JsOS{NAHSyBU+rdYVjb#$VUMRQG{aLhL*S;ci>LkjZ$<#N0gx)ozWHDaX%hF zZ#;+rFdkWMPkW4&kr<7!M%8jpY#M7ZRAV}3Vism&9u{FSUcoY~z)HM-%Se2K4c5~m|tEPj@i^Y|J+;744;b^HgvLyKy06KqID8tlkG7INT% z2Y!SQK_2o^fFcy*Hnha;XcLWT@e)=_(E%M%hH`X97j#1p^g=&8gdrG;;TVN67>`N# zA5>u);&=)(@HC#mvv>{*@M4U`%XkH^;x(+m8(4#NcnAN$CTzwQY{L%h#BO|qz1W9O zaS(@b1Yd%e9`Tbnjk7q9uMzu>#Si!qKjT-_<0edbTHFHOki>aI5>G=q9LPjAoXCY2 zegqLl6pg_fm3SeF&<>^OfQ~5305TIJhb>Vlr#ILyA8E-Xq0h;9XLjcS-TtcoqxsH@t);conZ<1y zybazp#cRO3ruar|0`HsRyl;wcH-@~CSzgE5K^($i9L1OT3MX+IXYma#g4a>;OSp_H zxQc7IZfty`tjL?s&nJS2pfPR%FP!4MaEceBIa=a&qiD6~zK*Pwp&Wk&Z<^xWaX)z5 l6z>g-7S!Ie?M~?&ee12?Lt4n2 diff --git a/intl/tzdata/source/le/timezoneTypes.res b/intl/tzdata/source/le/timezoneTypes.res index 5023ea2b465d3913f0b797634fb0aee557332a7c..7d18d6694509ba7f100c395534dd7f889639b11d 100644 GIT binary patch delta 2295 zcmXw54Nw)w9pAmZy}iAA_wMd}-+S-gy?YP*qSO%LP^*L(Vi7HVmZCAQN~|G9Uz8F; z4P{;(MJAFrN?-iKf@3Wz;OC$*LM>5is8wS~YK?VJ6Y7|hGL|6Y7blA>fpe!+=$GtUi)h4it@_k9mO(n z!?x7ov?5Xt;$Rtwr}n0mq`35tJHAMNiN(vnuR(c7&V&+zOTkL8s-rHeS4pK!QBs?p z|5Iw=^G|pDJbwc;Uk7i1Qt&G){td9g8cV@MP-JNlsI*pp309{zKkM%J_X`J+nGP~Q zE|4tbSj+-W3;CcJlz|qZ5Ex)i>g0^<^s6Fpw5zOKrM@Qit4q`#wLz^Ckz|N7WK+r! z^Q0PkO-e58(e4HfGM;3UsU%F(XeOORe@ri_)99Ggy~0emDW%Ue5|8xxq>=8XOG&>t zB!<*#xmr$2qoQulR`bQUbYHozgcPdAq?ptvJ&{DE*PfK(QoSuEos*B)Ur;357xs3s zT|6nYi}!@nl2aUS3)s#It+r+{$Fenux%T&!q&;aLwqLSzkzAv^rVQI}D@FFggeoeT z_G9utY=@*8X;A95H(DDXvFFHFak6?-LZXOkBJLx#lm-p3E$$B*e`4l zWA=WbU&s(oS@^%bSZKE2x0NVFY_&=D&xD8a`&Nb~tL(Vsmj9@{Cdcjdwsvva7GoyrB}y7Hy+ zNKw>rYQ7p%E7YVq1-7Wi)xW57;osGMbyRgYOveu$zkts>7COotRgR60ZH`t)m!lkB za@=$bI)KyVOm|Ll7C2vY#uLupIFrssXPfgw=NC@sQe9zJwkzNDqHB$7gKLNDkn60g z*LB-9&fvHcoun9d1^dKPqXKU z=Yr>^=f580b$iEoCwpglU-GW;zUAHMZSXdE4|tDz&w4-dCT@7Y^nUFf_1b(sU%GD{ z%<@h375YkiFZ)*cs(iJ+cYV#iHs2}VIp4>=KHq@v8z0tO+Gc2K6Se2G`Pvd~rS_(_ zUTe^rv{vms?XTK(tzR3|o@h3Iz(2}Tf8_tC z|8Bznwf~9V9`Fao1#$v20>yz>1C@c=z_!4?zvAUF~Px~O~fus%V5Mt@eHq0iS}(qGZn=+*j0y+QxIzF$A4cj@Q# zEBbZ4Umw&T=%czA3WhR5Q$vZFp%+81hTaNo3hfHDhq^)+Lw%uv(BqKJ2pSWOJfq0? z5H2<1Mz!&d(P$hrI*lIVGvkgiY{0M-_J=dVlf%=)^TJEQ<>7VVE#W_ekA_c&KMMDS z2f~lT)byES%t_`?%%7Prn`_Js=I_kC=27#{<`wgXIbc3cm}0~q85{Xgq$m=LtcrXB z-->LCY>ym>bVmLbxfvOVJdViGQ1q#2UUXh`Y4r7Ib+kU(7(E#6jQ$H=jNXoZ9ffI1 znvpgPv(lbT>tlvc11d&q(J6e9k=a@7Bizfhz&LsvCy<*RC7bzN1W^SVCX<+Ynn+NU z-^E`b$H;jm&Rs?Yd=uzqYH21rhg*p!@|a(aud-A4QmzlDU_12k>+wpym^;Lu;%h+y zTz~@rK?>dQ0gzz;u7)zvnOtriyaJ~&>zS*Npl<#;c$@hgN?akm1MVO%E(VYzTnBS2 z0VMPlQ^4GS+reRBGqaU3znOnHv88ApyM%EfCwGnS z;591Iq%gue=|z4IlLOANL!g)cia!TW!y{ZN=;NdOD6HTfLX*9QH7<*L0{Z!M?jCP& zcev$D2A9a7{dhc61|IQ)(4bp|CLxDwJTUnIUe3*~O?#IkS=xnJDv!nS;Cx zVhJ6~RxzXO0$fb<=^-Y@Qg)7Y_s^j<%zh>pq|?2i6&wLEcmkw@E^r3)fXm=haFon)_YYe6yV*YowSe!fXFdei!^iwJ>ZV9li3@j z6=lN7FdOE<=`aJ#g7aVrTn1M_2%zwsP$0|}ctI9Cf-a;98N$=TWMMbGN$=4A&|&%w z-A516m0`D*iM( zi)bK5o^YR&Pf-=FM_=J4G=^yz60-sS4bJE2T8IB z=hCsT9PcEzxMl1$W)I%Y8t4@Bke$Y#BZ(1w53i*G5~tg_%Ulz8k13^t>>_?ITF);= zC%DsOI=dL$Wsji!_z>>m_Ve{z16Rf^=1fS*0CxiQaQ#d#KEn;O<$M>~!q1IZ0 z6pfSIn22adhL|fNTBXKNA;ze=G1LdK)=7xsBg8S5p_Dk(T6KuA);h$Zy_ux*+3$S+ z`0f6FzuEocw=e$z9%zGahOHfL5GDWsl>zXM`+I#10Z1*-bTBunCacs@cj7l=ewO%b z%zXB1@B%0U%fPP^M%o3u94rCLlS64s_~iWYb4l|3%+p%psl1;gHavMOvHmG7`P;m8 zF!ABzT5{sF_fVt|q=6hDr^rkx9k^2Df+A1>TE#qIgPDoZ{H(O|(pCK}T~$l*W#2Q2ctX zR3Z0k{hCkvMk|(!1*`KFrmM# zf1uBWf7W~TVI4SCXV6&+CpxD)i=5@omCkj}W@m@93LbHuarQgEc5*J4E9S~}<-1B; zzl^)qxHh=9x;}J$?z-uE;8NTXccwevUFv?`z23dueZYO(ea=1T{+Anh+@A5C$2{{q zi#;`-^`2%=yXT1KtY^q`*Mq$tZ<;sTJHxxkyUe@B`?`0Bx6^yZ`#0|`FEYHwSmP06 zmQiXvXRI{hMuV}%c-uH&95YTC@h^?9jA7$jL-4tLYoYBM@5}K`^Ud`w@|F9leXsal z_igp<@g4Mi?CbIM`TpsZwsG64fWAh1fwz<$;YF3$Xv%zdO-!VTjyUkv+-@IXd zYcjvvANB8mnf`ZSuD`&)$Y1WS_P^q9^6&ER_aF0r=D+CwD(=7G|F540yn(d9!-2fO zGl3<6>cG0d=DvU`=pC@OQxj!9N9igMGoF;Mc*C zAa5y_&x%?TtcR^9tXbC6R;g8Kt+e9SYgUuhYIRsitIO)PdaZuziZyJFSYpTwjSoE% zisy%(2|X8D71|hT33Y@Hhk8PNq3fY<#udyWKuye`;T_ zFWWcmdo~T5;j!VY@RacE@Z#`_@Jr!0!#l%!!^grs;lA+o@ZGQwaYtg2pGKaH%#D;r zo{zj7*%a9sc`woxITh)PT#t;zBQ)xX{wO**S`b|n{Q^E0T@|g1Zi%)>{}??J?TcQI zjz%4^P%I-hB{nDa^H^nUb!;3ipyz{u!kmT9f*VT@D^ZDg#kDUJTL-lAR{p@ zSEz><;S6pg*AEFgOb00lTdbOAR47jmO$G4~MdLjisYUxw!K<(vz-gkHLjx)@>g;!P^EPv{;l6P)Dlf*v|V zPr;M0Lns56s6{bXEj)k`{t`BYOaZ|GnkHPMwlF9x2| zlfBCA<8pw_c7qPEA1r}~z)^4lbc3_t0_X#m$#OOhpW?HKg=2UzeF(S3`8K!)&Y&4& zHty%UU<L!0 zmgJ?TSX`WeTSyyeC7Zyg&^F?<$Q!W9sL zd+bqhs+ccwA`>;y5JO^`I6=%3Ti9RNAo~X!X8&ftXM5QD><~M~PO{Uimob3BYGFAT zOS0m8gyf*BBmo0t1;1Eq!g=To{w}(Kno)wUqFwwnVuE6FSLi1fP%Umi*YFNBm21S$ zlDN=~w&P6nBJSkpk=tY~TtgaZ61T!rqyja7da@Abunbs*6QoaA!Vhq}a4T=4eaJ;@I^m(qYKRCK^PndfZNU9 TeYeRCmK@b%%aO7Lpb5b delta 814 zcmXZUOGs2<7{>AMn=@WA$jRg6jN;4@slbqdyr6*@78s)^kEg&ELXD7FXpm7tNJC_H zF;n~sDJ?M+Y$l`WzzAJ%T8JP*2-0QIWznK2x@_FEs6W&TzlZ19ypJBpk8wF{6n1)r zks*Y5t_g9%`_BMdVk}WpSfSQRJ!-fzUmeKvIL9ltNasmqN2WShmZSERd7P2j{wx_% z{&2H)O|Mj4VZXH1rLd`0=~e1=c$-XDTElGixbN(y!2*}47jbPqXGqOA9FlD+*jVfO zk*^LnrsSk5GN;|eda6p}$`UZa*Pr7AX8xvWw zZ{4a>+8mK`R1Mi%*PHrGuHjC1f6g@33p>vhi#cy>pN#G;6qX4aEoemq?Kp*AoJT(f za09n+7t@F#fh3+Hg+(l51)uN>Ysd%)D+fg=K`0=iRym~xb*M)hj-nGMaRyQJ;R>!} z0#len3JX}mSNz0ph@i02kcDjI!jAwpqXeN~R9NMdYSf_~jo6P?M9_gQbfX97Z~>Pw zh!Kop9Fv&AEFNPH&#;JPtl$;i;TvSs5Y`Tuu+f56M9_}Y7{*Q9#ssEt9}nRmg#|3( yC06kk@9_oS@duej!rBNQf+)eR5K)e5?8I)g;Ucc$4(=g=B&0CJSgtT)|L-qODb9BQ diff --git a/intl/tzdata/source/le/zoneinfo64.res b/intl/tzdata/source/le/zoneinfo64.res index 3d809cf53a331195c4be8659e18d276cc187447d..9b7a5b35a7536b21673b6744e3b196df773206cd 100644 GIT binary patch delta 12654 zcmZ9S349IL8~4wdAh|d0&CPO?T**x)iHO)m?Mo1%#1^r}zAv$aAoj#gZQ+)oYA-F` z(zD9=M5);J`(N_!= zqs2JS=(4ha%RFiAE9O0S*Nx~DJTTa6@8UNucz|D8 zM4hnN!963igl^?}C)AEVSoUFjdVEa6*Jb_6#g)s7pB=x=zhziv*l52`{U?^q3Onw9 z)LuJwRKx}QW&hT(bL0BP7TT8wPmkCf{HuLWuqR?ooHy=RaOtSc5m$o$w%-mOA8QL( z5E~irGHIw51Ad% zDP(C>VC3Pjfgy2`ZwI^=^`m|vY+OjqNHglkuv1Z+0-l7;4q4#0JS6YKawp3*PFU%; zIb>JBANsYZJs|~UpT<3kvc^QkoQh3~xesk z#0+$P>{uNg@7fXle%T|@wOpsHm!t1S_b>au=oYT7u5r$xuJfgB`nH&ZG1p7ab}o0; zh}-O(7AW-4#?mXs74n zj!j%g+<*I8{c=jB2GuHY-Dj8eo;J+qffijN&*R_ef)+14KXm%Y881rk&r$q4ScI}2 z@7>UOy7Y->Bfe{j^eHdmJz3o%s+SjC`PZFWu&S1%=~@}BqG+Zy(aMYR;#1K;YUu8w zp?D9cuQ;le_n6&MWJT|bZaqtMniVPv3*cS&0CvM+_zJ#-pWqSv34URsFa&g{1a+Vp zw1*xr1ja(X=fhq#LVB=(^ny}a(OUB6vOCK>fA%VG+d;_zI20xvN4(X0`$*dvn~4}J}q2<;i51sTsT}rAJ!d35WMZ((C3C07>}I@+h8YU7raaRdrR7GBb&KIVQ?AY zXzooPnj&qT%80`0Fc-_?-7su&N!wQBUvN4?I9_-Xv-1M|BSm2VI3XfZIHEjzv+r7} zqB2lDJzGcLwPc}|pjLTSjhSqFAGHfioV}iyoCG=5(=w;N?IhkM_y+$w&(fS0mfNUb zP!Byfa}sPz7!hAa#2*|U=h*(X=j2Pd*}q#jf;_XwrdVQ838+NRg|YozHBogT8K()6 zhN2FHd)kbd<-9MN2*XyK^rbxo}*EiI6f zk@LOj)7Htr<;Yd=HC)Ah;FbC7WQ^2BVM%BTEp*}NN>oRb0)ya7?~&;_(lr8mH0-40 z5K*1CdPXhvwwakH1214*hJY9@cZ_hvd9Tg#NLL-?c$kc}kf>Uv!X{7OX(v4G=N=AR zkGly9;TBcDdt>G;kv2=LC`^U4SmEg5Jup8{+Ov_{VJFt1SkLuY_dQ=OD(z{!aJ}sk zc3>PQA155;y$=_9q^$vR669eOco!|kdJlOE?qdDdTe$$MbXif@655p&jy~QqOIv7` zvB(?9|9RbS50)0cc!njOVeu|no+~W_keiUZJvL)W;1{TGP(KjeoYq)R%+wr@zOtj` zK8}Am;Rx|gT^XlY^m1H8~v8m6qAaOUS$4r|Vuw%iqZE<%J{1`+P%~wB(g%T#%;6wW+u51nMg|hjY<0ds9lx zkEpw-pNVSX^n-ln{d5?`1=->G_0&gRO}Sb0X(OY~WeCJi^HLm)RbD zMF~&W55BeihF!ISa3ojYKKLj7t*6?ym6mo`OGvHvT-eszwg+_x^*M2t**8$0lSV

xJXbkLy2G1mrtH0$bMH78#3NvQp(eFxv$6Zp>8dp>KCefDtYRCc&BtgB~e(T zl5jL68u>M4yf=M^j~1AQd>^)x`kYwDvvqHwr}@Wo7LEjBN%k@d&Os!H zTNcK7AAg*zxoeYd2y0;z~uJnc3BuWYxVDKEEz) z3(()fRlG+Y=dmnnsU&XZB;g24^1O8{(;kORfQnd^lRUp2YwK)?OhGm$s?(kUGrgUT zFYs|?V0DIQsb2`_O<)>1oo{GhCN>6Ks^7=dgKX|;r-3$ZGxIL~MAb@EjH=Bj-J&KlT6_M=+f z&~ML5=W%p!ZDwEXqJdk&N$vGM|L(MOHNZ-S1*F#%rwd3sJ=d;ovhBh76wZNq!ZP3^1wUZ53ie=b12quxCwVDDOH#2_G;{w-+UqMQOI#Hxvp?5 ztLs^NtDf}(`%I^G>^~Ny~clY4kUq`S;ejZlRvQGn_w(>VVh66i<_%zp>lvv(`h6`rJ~8< z4QYjJhfF7`Tc^+WpKSI#dN#rH`~4x#o|t(g=Mz;=8zIU&`j=7C_72t>xJvqg_u+$Q z(*7s1Z39-|2EsA4f%munbe6WMXcK*cSi!g%Cue%Tee{L<3X=D@Lf?kM5lmE_zYo!D zG-Fka^j>+KEA16YRe>DJW;gU^K1q@m1APL0$-Dgbsy?B2kP{j)#*KKy6C2S>pYJ_q z-w*RXe%4=F_uxGv=a=m5^}Lkk3Qrb=qmqSV4pB|}o#0_LAMKs`;*d|!yV&cYU1QFp zF)t#Gy=`C8>}~XI_ytckDLUX?G@WFQkkUumU3ihuqKR;HXkt#&WLwSF2jd8wz`SWl zU-_%~Wl32{20p`V-;_Nx6^<-oS97{1Q>5{xpZvi!9pihrLGl?#o5W#NC!AP(g9A20aVwZh_>Qa{st)Lz4GMbrl?6RJ;_roXv59a!2 z#@PUQ+_D>e3H^hy#v#L+XVLFymGD zJ--C4Ij7ZJI4sT0UV(C#W)H_$1Rl&?&CRF~c~Dxv#0XAhNk}#BIOQL%da0tYKYAol zO@d=En@RAN`7~4}OXE=)=~v22!I4z6X}H`cT^Fc~XdxU`TNJf8NQ)CN(QuZLSM5!) zQ(-VA*)5E}%gD3NeDpf>2SjxZPs2jh*P=xLrQ%SoRS_J;UP;3YLx(~O`Ba+kGvnkej@CLDv(jI$MFFY8!z9(qQa zQLCc-!@U^oMIRulx1n)x60U;VY*|UBX^CgaU4r_pg`-nzUe?L|AJ_pO!T0b3%rOsC zk=uRTL#fGzh&G}yx{Yw85!Gm2hxz90BzaYH_r~i7x8N={mbOJTh14uCr`D7ST8tY{ zhbfTPRyYizI`5-!6K0vmYD<>U9r(MTYCD#}cEZuIow>H2{6pG?VC;oMm{*Jq4dh(w z&&U@@+1^NMC^N0L_B`m?^TDINxuT(r((L6hX24v`b?uF#$uc$gW3-9hOYFdo#fK|B z0dtegHjU+WX+4G;kuDt7(+#butYU4F&PxEgdAd=rscdC!ht5EEN;eiOJpi4B9+7VT z*i@!U>qLy57zfhLq-OFrX+49H(1GW82eV45Tp_KkJMbEbvA%*sqnxSpwGU-mmSb(vHsOH9BP@VbK7A(fGb}~8aLsGlIq--xSg_1v~UNNe^ zE2o+(+e?RZ9K-hSBpmKeqOdV(Bl4OIH_xZbDbijUZzSZ9pWVsK%#dw)8ep8mxMqIb zQLdBLhv*ue8PCo}W@kCa-la2B8v5f6>TL2zdPj3j!FYxd)}?5U_;HL@m|$$^CUb-0 zu@j*h)ab%Fb}=es%C_z_bOyQ;QJrFGnp6ZEgBWNm&y>mbzN7|07G)#47(Zspeb$L+ z5Bi-h=9cdK3B$Gx!>23LsH-S^+uS-x4whzQZ#ls?s4~t`@X6#B&lHZ%ndX*3@;`nt z!!Trb-aC8ni0L65D~M`#2eJFQFxl8MO7?ec!`=ZVCHsi#>IRecF{@`YI`&g|XCSyI zueUwT>!W3owASg#@nTHuX_m=h0$Ju_oW{6j>>Vq!EWaY3A^&Go9w*aWrF+r7mvA_V z>JVJ?-wcAyrQ>9OEhq**9^Qf_)NSi!l$sz@ZAZ~xzzMvQX157)fpmU@j_55Mm3kK) zYb5=|8_y@o$*u-i$&g06U2!^!bhNQ(k{W2N0Wg^K(B9_vljIiZ%Ej1^afYZ4O`|>r zN*b%C$lSnN*mvO}JfZ9lGiIt>BAu2#?4}QY93iR^lQb!79GfQJca6dt19M3)Do&Rp zonX$+<94>K!`leIkpJ6kI9+_v5o%Kj9eC&%8cIz9TIY zFb-i{FsIMsoUAv|as7p(W`DEHTihtt7X7)aG3NI-#w?J-tZUHkqqp@p?ktc^o%_&- z&_{^s5MIC=M#F_N*>(o&JX|7u#hky8HNbic9Wj8{h5_dNMJy8T`UAK#F{TsM&G8T( zLp-Na$LP64*0y^{t%TK-tr=i$Tq4&>>sE|kG2}p_)lzxX89b1+c_23(Q5{DE+GiRu z%jBiRRIHXTnDi*3dbE@zT?!n~5N1Gv;r7U@G1DoT2b*C#O?DI2tcate5%e%zZ_8ZU z=h!FU93>acHE*j+cn@815TAMn6&*xl%Db7(SI96K)DEu$Oolva77Q{*8uFm^U9^cl zILNHEl4aL<7Q<&SZ(4(kI!U3EAY;)g8R2vIudU|xRdTj;#gHruSrkqyE^JO=s?l<_ zOmP=rdB7mOil~mi1?domCe+xvT4n{kkG&msgGt%`!DhL4S&?0*Fam}MN6e6-b|q-n z3ewCAYk1joRmZOhS=3AAtv z{zG{S9LhV)Q1jGA)(%$=hKX^Ks1CL^9j1fTnE0Mdv0cT!0kJ-NFs|>CN!AG?xaR1oBg`^hxluajVw}VHk*GTCONXP)3%hwwOROkFpYMD{ z_HX2#Ld%hi(?}jcL{;05+H7zb(+|iLqp>MlyQh%Lg97kSyQ;XhKXu~``ki9Nf6Aa& z{-^T~DA*1!!FLpY(il}V=JYQH(P$+286TQ5&M3W)SNB@v>p=>nQQvNqF>Rk*>+XZj zfn2<)M0MQ;(sl^sn05Ed8d}f-{3Y-!JfW_1wlVF1+~v}M?K}PSg4((Mrn|R2%Rf zcwsmE1%Ja!5FCXx{`x|O5#Ns^t{628S=pPbiT>0+<_z}H@2vDdiE zYcI6eE4=mEizxQaUwQ56V?^Go0Xcl)wHaSr_|e|iUWH(CVlRKm zYp-sxmp%Qp*QnTY*z?r+7M*cQvAKTXYwyis@1u8Kdu@un!yml%Iuv{7KY8tSDfSA# zcs(o=6 ztHv1PPsp$BYsq~I`^WH?)iGw~mptyB-(W=K@Sc=YH0PGm_W|?yN!}b28{j2FF8Mh` z^;A4W{xTH89rziZne$Iee_8omYBs@_aGEw>7q@vtyG-g1!wI+!znDk9;(3^OpPI)| zWh`&RV}+v`QQdIUsM!Zc;cIZ2Q_sr5T3{ymK5!gPQ-8;NdR}&y*1yrU#|cO3I5YF2 zdSmM{j+Y-;hq;TW2KG1|{l|1&mR{-p0`CNr7|#+nUO2*us%AMgUz$H(ku`h*>)_Rg zbL5{AbIiwgc||d2eJ|Tfmwzs+D$LB~??Xh@`ZTS-Gag=*FWq~wK7(7N9}?Bt7fSjJ z3^Og)5k}!xGSYl>Lw+jlJ8=I7pNSmiMDvrIa+-8k znaE$8F!G7&t>`@6UW7;RUo-udtSa3FP`{WAzUKgl|!9suK7vE`BeT1{~qK{ z5{`E#F&5Muq~;WS1!v(3ynsK=hj(S3Ptb1aK7$^U`3N*wIOa_@r~SewM*Dh|%=9^Rav)-Oj0^FdPO? z6^3&6`h|TS2w(>cV)KOwGb+=A378 zhIDPjxQcO~s5-tyqucPC8S|WHY*5KO{>lM;pno3UYvh@=UdTDpvKZqWMxlA^Po6>6 z-_SMknYH<5+rQ-X8xY0T3czqfc_hNrVEE-y17+KF-hJPv2@vM4Hu0X&KVq9Ag^HBmxGyO?LJ+ON_*8gDF|Ab*XhM&TIw$MD?zuCx{> z%RRw=29dLP;h!ZORfwvee}2^R)NGa!Yu8epEy=Z`CcU_(G=+9!s$HvX?}^n1`jZ|w z%Q$M+S~*9fbJ3HE%gaz+(TEAqZY9panh%@ceM)u`)q?OdJb)NVW1*5+*`amUf{v5_ z3aZTJQq1P1Y_{=EkT%{m7@Y+ThNEl$LAQS;aaNgBKk6XgZG`WDqK5ly^Hjn%f+5+ zjC5%otdVmWKy>_EU6D@Ch268KYyh6nhuaJ)u9P1Lqq@W3};7qtSWjnM5kZzhAtT&Nn;9 zX-Pg&D@ay-i$B@CRaErvx2}P2nOn-KqG2R`7Vw?kf})~-zpm9?VE&Ovk);vIZz%fP zs9sqM4z(>Ts{QvXThKx?v$9sj#}Y@CBLI1+?2yV$MDbbw8B%{^NFV*Axh{wpkB1l592Ee*nSQJb)h#wpCVR^5&9~S zu|gjTUqQ_{p|6P(d3wpRLLULDG5=>t=UbKR`p}#0LvR}+$_af7sG36J?=UGr=#A08 z6DO4y`cb$FYNwBgs-N45LT^<;=-WZ*6gb89{E9-~&$hKvUQws1m4to~s#O;H7tp*) zk$;wGuPXF-xJrYciL;57s|kG_@NS)*UtQ=gKpmVSDoNuOrx0oo(OxLQes8 z5M7A{@Dx(fV;TtkJm?Ma;Ro2(Na%UN$wD`PZw+1@y^3=i7ioJFp?8A^FutkKwG^Q* zhG!7oOz3>~oBakc6SjidF<;wc-(uU*T(`W5n<` znb1(KB@+rpkxXh;)M34}*F*cy5Rbx}4_|;f;9jkT-l0uVouh40+(PW$PUzQR3^ji3 zg&qT}aM@dkhoO>|$DNqYB!NmK>TrisKhQ*9STiMq0x-b;b1IEB+i0dl!o|!^d#cO&9 z{d1_^Q|L3`KAge#?IrX`*aPRGc5f~Nv?iBLj3Qnq%05CL293}wiRuIsz|xofLEb!m zd7(6>Uq7Mezz@*0ztC3#-!x?JA$|!zK&=6sJ)~2=kr+g@59GFkNw6PoLaRYSe;ZCh z!{`{MXK^}98t75%_xo!iDU3bjTHKNNE}t9hv0Q(dlm#|=LtOvqh&U?15_JbR5S>00NeeD zec>M4s^M@L1^t0<53|)ZR5N}TD7_Zc0(%tyBC%gF>Qc^NTip%EKuuaTDKGM2Kl?f; zvk*>0H74Rr72yUA4}e;|_%i*~qvK1o&lsVvAX=Ec1cw z$HX?{guWM^qbrVob=mT=`JXiU4p0q#FOFL#6zPPCEX(){h~L51NjwwKp2*x5S*#JDPC}tZ>Hmk9((GV-wamv5OA@Q8>)(}z>NZoi zl)C123QMy+41YQ(Pw5nJK?^9rQ!!aBT5PM)sK~Z@s;SjeJ*+mu`;b9SEpCb`pz@J; zsy0u}Otq}?|6*QokR4{uX26lP@%T} z-~=u~V`u=Xy;|+wrndWA+_q440S6C03wbbs6RyI&gij delta 12593 zcmZ9S33yD``^V3@v1Eps%p{p4Bbnr8v!(WZ4MHrj#1>oawQsS;77<&lr3P24q9|Hw zo$5tf`&!k~Qc98XL#xzQw6y#`N76^1e>|Ug@Avz@=iKewbMKuob&loqG|M90(|D24 ziwYqcL(4_^gs?1O;`Vy=WI(cL#d1T@p3fxF(l@F?X2~_ zc0v0?`%~*;5Ai?X8EC&?y=nc!sugn-i!62|@T?~!G}iw?iHiOi_Imz~m~(+|6uS}l zIIwU~?P62CBT^HxZh2~jcMR$mIMyhjtAe>A$PkfVd%{M~fY_$H$BaKVv^ztai-U*fueF_N77D z;p>9#*>?tc!{^1Wjy)3e%yTa2h5bg*TQRnP2{91?kAo(ME(pyHU6Q454gE;BMXn1s z!wUzW2-hQB!BrwJh2ITN2#61^9grOPeaW|Deu{geFhacg6m2UH907kI5$ z=YYN?vr2Xh>=HR3V2b}2`q0QzvEu@o1kViU7@QUPGJJn%zhGy?l7PjLr}ZXy0ijWo!V0_IjGiC1GVDNn@z@~|Wur19>P6Lw+Y(kdbYVn#boWBbiVX3( z+x2vmGxlMxu~{rzeF{4cXp3;4RW6@ z{yb`V^e53*iqCW{bw$Unb4_&H^=N&+qq;Y$y~kNR{)*#>Yk%}z$JyxjEk`1%dRw(0 z@W%Ow8?L?X$F9O5u8?0N{B7U5<3p;2G}W7ggxI?3xkW#=Y%CgQ%X3$@J&*9_wU20G z^K=X;bW2bK<8={?_} zp?j<6MNzB&=pxC1)eBwm+hP4h8|-&Siz+n5TdCt2Z=tkpt^`qte~yCBAQ8fHg6~9H zw)9J2p;hN3*(P2jh<#c;u|gXvH)xYZH*riXlT!2+_4pSrI`gj^s)ANo)3p*>Y0+3~ zsKt}nCF)8I-Ho~rae9k`TD$Gpa%?wao%%1szh{SKIsmHwfw22+2WgvHx~SPBYKv$eMqSf%uwOj z?Q7f9Puh+kZ^3U^kG;KnHFaCUL|#Cca5#y6Oh<}9@cIt)x~e%n*wL^CHc)oLx4o~g zuS910hXN8aY?Sx&zQkyjLK z5ELOCA>JR;Z&^yAQcxYeCq~|~^hM>M-tq1pHOaOLwGp=BZ1*-CT}n>&4jNs@b^z}r ze2ag^yM1(1%VpGc)D5p3Q_A)>N2Ulz#tH%6YGeA^9*}CZ^lUI`}Tn$&&Vg$hEKm%Z%~9 zm~q?t%Yx$GUh_Y&oy4}pvh%URq5EtLywX+`ISMkcX8Sh3jrBhA5?sZ)?`yRPt5BTC zYY0u_grl?X?mJC2%TVNbEOdT>`WAJT z=wY|UcpGMp_BL4F!Ez19ucUAk_pMwWt69QIauShCy(iwgYFUdqhGIyrU`V2_qi*=* z`>~qs0WzhO$ZJzdI0pDCa17@w@4B@~(HBuyQ9l#a!07{74E(7uoD;Ied*pl<~fi+x;}>bmUdIPU<ZrNNLGx1(Y|5kb?LE`6M4mGe8YAZ)k0=t z&xc!-yd*}GnmXI4?~$Xu|9sxp>MSqvs+4EqEAJirMLTN>vOO}byzl52RzF)G^nG}Q z7v{aZ@1?bL1u7~CM~@1=oBO|$*1_n{(Wfi;4j!E7Xa5;Ju_9AvMd8>`(bwYW6=^$! zc2r`PtRx(zz15BnvDQbWpxRXOZam)A-VNCk`eOB~tT;(XgL1W9LmWF|}}wUAhWRIK->4?B8WUA$yphjR`tk^QBb zull8Lr0WGbr8>i}dj64no4wlQb6-9w-D9va;1KEa1?h#PgT4P;S!=tCb03P<5DvR< z^VOo7JEDfj8wR7X<`C71S`6>{PW^0ZuGLr{g1aX7rkcW0pP2UQ;O+e1b7@aQZU!Hz zuWEYt-mGoSLtaPTsOi;i<;Fii%37?l7KfIoPTX=R&5FvvSQzI!a_g8D7(qG)R>4}z z57+YL-qxh$0@|;(a0GZi{%w^zytc?ofC@NOiE4va!X$6+JLm1mIL%=Q*)g@f$#)wC zPebM)=MdGk)9d1A>%5NVyhqw);<| zy=onvo?sr<>N>u_hiTHb6MYZ;l33P|rQ~$)pN|fEY;_qckXTnZQi!Va^$^KIV`j1l z-{U_rq`fbx{;-L%FYEdyKB+7%-=bfli}`jwt>70DSx@9`17AJi_>owjUV2^h{=Om9 z=X~B*TJPdjs4pB1>ieerT|{%I)@MpZ?Jd1q+auV5(MB&(# zXb#sT?Y_qFG+=UUzyk+SZSi)PU@j;m{iMAuUI)k`KevIITUfT%oXau(f|r=?h9a-C zvAVGQ&HTk*z9F3zFlNKNhQhH{B~6k^(im7w{^Z_`5!guNg*Fn73PiQK39!@bUR;K1 z&L()xU@iI2iS^a=Z*q4SFD+-#K}nnzBibQ@3Y#>0$Ef9y?E`Biamb+|G^L_>l9B6> zUE@2Wd!l<2)esyAd!PiXjfY`iRofnFRCUT;fg`EQfN79JyLn0GdZ(-{?eAe6hm)8W zl8oO2a*qjn9cWCxhj3aOo^LAsieyH3lt)dC@LKEhNCPopreBvI3UV&au zR3qUq%wQzUFAgV@R!ciD+RP)G7_KDb2 zU=<}FB^!~E@*CGK^m%k1QJu!GV4f+XgK}H zov3;`15@ZJ$BZr`{R-K~;!l7YE!e3RM&)vHhc&YWcYAbh3*+~4vWN8(w29u+!bmGG zpLmXQ}s+y}X*IZdsmeQg-;&p~k z!KCI}qT25RkO$Mv8?`0V=}r9GFrYQlVQb---`d<;Pd<^h4=^6UQ%sw2AW`O6qucNd z(T3~3jnS@w>}qX-Zi8;u#{8^-jMVHsF!sPc%=2xGYmH=b(68uw=m*4htXOPb?yZnh z*&LQ6H%aS1xb0JgV^FFQ(?piHPDtfx0G*j?bZsJASaZq;&?yF^mgs&EH$dM$&QzBdVQnlrw9! zlue~8u^p!eolR7S@d-RNmbQ}L+PzrIz(@M?cIK$oGEG`eVfeM@?bAHdMs||+`1T^N z8}!5*-rlUHr%7^0WnFHWu7zItdg1L zuJ+O)9sel11235!cv>NC)XkG&=KT(Gvb6WZTMwJaf7!vDm?m3uSHLLRQ8--YnND(* zw8nSjw4yUR8WX$7S@wl!16JVWb~No><$Id@Q;Z5}Jfx-NkCCEmqXjaI18>TV!0y<+ zVIT~lYLKN>@Ylbo5f9+6wg@aIA47TW)Y~z}g7=NFOOk$CEB; zuA9c?Y&(y45n_7@M|HFN4C$4wX1y3D=#@m(U1{o@8HH!bruMB^JHRBpyO+^*mdte@ zL!X69czHzCB!MPBna&)UBJB_H9z#NJCZgWv;MsDnw5IeHc?&T<=xx53Bj1yjZ5U56 zEavKY?32~qhikNta185X)?UDcV$H(vVI1gVEPh)Kww^;@MPKV<6j>-6xgMgQqW>bQ zO?U=XjP46%qOEXWzS@9deVG}}j~6lrSi{ln(Y^bc)_0gBJfkr-VeBTVi{lR5hd6en zhLO2g*07%>bsD~>>|9^-;9{98tv_RwdW&6q%NV>w9(1L=#oUY@PE^}bhxT2JhD+u5 zWu{%~HFArzoWlqosBR_AKa_^F zCJp345dH2z^Y%LC4)-REdl+(1{z|LUVJcXRcQ?o+TM%|Agbxx9kNN8cCM8z_dIUO~ zsJ5XU(;s%?ox5&zx^)N=MAw2I7 zG3RcRR%vZNggYz7%ppeZcG=Fg9K8y?ny6OOiPdyA3h$6l?OU;Sz7Gid0VqS z!pIoPt_?L_?39(Q+lF$^(L0BlwLg<jNR;IKNy?!hz z(#w)72icHAZEitrZ)!(?!&tpvCK?u;G=qwyvZ)sY=YyTRt5 z12RiS&&Hbvhv67C=L>3vP%|3Zs{@c=?Aj|^no|$SsnTP#6jST|uv-tf1b9RBwbA;5U*Nw2^$FPs^oL zFN3wP1AOo|`~xrGB?!ZFT!vc)doy_8J#>sr_Di%?rE+ zonCvb3%tDRuf6sK-sy9%z0M;=)~gloKla+}UQoDg_iL|Df%n0t*WQ2vZ_&!v-p~SX z>cZFF$O11t`?WW&z;oEM)c)r0@uULtgZZz$sRiCP^?JvjIx;g0y!{`&_U0CNr$2k` zEiCZz4!`!66nJ_>ftN*x?-rO9%f2qmE$|wsUj+D5D_&dRr6#}jJ}U5fb$IPqY z$?qkqyW(E*-@{e70l&Z#^W$%1Fqr{4Mvx zGBMPYf&MUrHj|0!g3F|4HynU-5N57CBL`^C#pIX63-B8w9FeB$tn4PO)yFW^qo<59 zC!SMJYzr~Y!g%84bjtQTW{gJ3ze?{vHhV80+>3M+l2ZU$vvrR_++~*?w zH4HM#Km1Qlk)Hk- z8!&be)kD#@^m+#F!BcbOO<6&Dj*~kDPpQ);^oP<+w7M{U#)ApOp@(a8}-5;=IB5yzwg=7CjGxv9180{A@N>5@MpTymA zl9_v-cM^MNjIH3q{A!Z9<)Qpcx_`pZC-ZbWSvaZ@)v>$8Dkhnkf5=DD(+V#YR+0ad zsBRn!$zOyk=7J}(o8~@^e-`Rwa)Zju?_)ptJX8L~&)|(q<*!!i8a-bh%nn)wD!`TiSZeHPV!{7xx=c>mA1eEkv4#7(RHu4ABlr&wji^V4ca2i!&JvL{&4NBT&IC6Q*Tp z_L_KgU=#V{GmXzmXzQ(4&`;4XW*Ys&wPc%h7C$IKz%0JTFm{J)C#_M)L}asB#@i8E zJ8K7YH+1(|#_b5Lx@QP_1bQSSy73PI>zHjt&RORtl!}g z>BqB-c2Qb8Tj3n;J5Ve~eP^{jN}K2QAmbqcs{&E=62eD)qob~k4ot#IhL+HVl6E=9 zMO~|I9e^H!9+qR2h}P1q8R#r@c8)PITB~nei1wnF<`@T~wPp6z=#OD5-i{oje~gyq z`3n6#`Uj%g&xWiv8CpYz@nekEKJXf;TktE~qx3B`y0wRmk@8LUFo&;f=HwUs_o-{;9P?-yRkVg=ow@wDH#fiNzmIDp=b9nqD6)(r88DCU6O6VM zwV;qD^YUx|`^eT}o;k6iR^HFjhU6`3?Z);hT9EXZN2+L5{32uKGxN;n<({av_`i>F z59XU8HCRv96Os!T@Y=b6@2;uhl_8xc=JW>C2SQ!g8!B{;R(eIy!i27(LV0loF$_PU zK&yBfom@ib%Rtrr+g`O(ZT=2_<;SF}VntMh(0hO?c#rsRXM2oaYir?IKVU_YQmB$U z=pc{KOT)k0@bC6C!c)uH#DfqODfIPFIZEjJ@D;OJegNHdp*KVyB$kdA`aAF!^o|kw zVJH_X^rf*POaF(3esTF7JSXzQN_rjW6wfkThMx!MsBpRa)qK z;CoOj{e`Idxm-r*jmiprEhwD?2U*@jY?Pq-%M$5RSg^h!^nvgUeNaYXojYR*tLhlU6A-Epvft30}&-#`Reld8}`Ky?iuag^a&LFO#(6>PCMnXRd6_SLW z3jF??K9sl^eg?JTqY&PhJ%hg>4?VDn&^LpYEcA5P4(c?hBl>GH=l{c|LjM7JG!yzw z7*1kv^ZX7+wRnAK)e00F@D9M=pf-3}iqPk_%&%+KDnDK!dRq%Uq>a!=QqzFg1(@B^ zuMq!)1eV97W(j>-YQCt!)w!7EPhcO*N{hA}BDe*$+p*Vh6!=mxNFnzT(L)UBDfC*f2I`?t6V(otgoeFXAMA&$-}oqo*`T-3 zH$iY8p-+UlNi1i2NuXH`pK8V2wi{KIL9!%X3P62F$&b0Z3xR1DgX#T{s zry#};0V7CP4Tr#R z=mY$6m~J7e5x*UjUI}V)J%E3P*rxz>DzjNuSHodYgH{bnRdYFu4`p5je!@(zz^I%? zR8#R48h!z4=HdtSSGSF0=sIlBQeq=wQ)mfoAq~1gFX#t@VFZkU3830cAx?+cumG|a z^I^dIuo~9GCfEi$VGryB)mX6;PN^L6Y(Z3eTxb+4gA;HT?HbLb1$iu&8N)I>fIrcF z$L625n&Y_sZ;s1v@J2>{yiyQ*ju-kFiVqQ;6PRRRFZ$#}1{AT?B=YbT%gK|4u8!6T zVggZ(iN2Zn^{0qcrZ9dWK8sULPW6++vNn|uB|1*c-=a^6{@Fr5f;XP1Hb8B$YV;kt z<}{&y2>SH=b}B!DQJGUAF~JFK_b)v z)n3hZUsLOyBlHhoz+A2Xs56fn6SRV$`J6(yHJ?H82MeDs$e&tw(pWv2)d6*g)HSTm znY#Sc-l^O02vCRd-=n5BQngb!;S#8gQo691A^at47iGopQex5FGGfuRP@zxt6TOZs H5L5pTj;v`T diff --git a/intl/tzdata/source/metaZones.txt b/intl/tzdata/source/metaZones.txt index 177a62d49f9..93fd931206d 100644 --- a/intl/tzdata/source/metaZones.txt +++ b/intl/tzdata/source/metaZones.txt @@ -1705,6 +1705,13 @@ metaZones:table(nofallback){ "America_Central", } } + "America:Coyhaique"{ + { + "Chile", + "1970-01-01 00:00", + "2025-03-19 21:00", + } + } "America:Creston"{ { "America_Mountain", diff --git a/intl/tzdata/source/timezoneTypes.txt b/intl/tzdata/source/timezoneTypes.txt index 7759a2aaa18..03724013d6a 100644 --- a/intl/tzdata/source/timezoneTypes.txt +++ b/intl/tzdata/source/timezoneTypes.txt @@ -4,7 +4,7 @@ timezoneTypes:table(nofallback){ bcpTypeAlias{ tz{ - aqams{"nzakl"} + aqams{"aqmcm"} aukns{"auhba"} caffs{"cawnp"} camtr{"cator"} @@ -80,7 +80,7 @@ timezoneTypes:table(nofallback){ "America:Thunder_Bay"{"America/Toronto"} "America:Virgin"{"America/St_Thomas"} "America:Yellowknife"{"America/Edmonton"} - "Antarctica:South_Pole"{"Pacific/Auckland"} + "Antarctica:South_Pole"{"Antarctica/McMurdo"} "Asia:Ashkhabad"{"Asia/Ashgabat"} "Asia:Choibalsan"{"Asia/Ulaanbaatar"} "Asia:Chongqing"{"Asia/Shanghai"} @@ -300,6 +300,7 @@ timezoneTypes:table(nofallback){ "America:Coral_Harbour"{"cayzs"} "America:Cordoba"{"arcor"} "America:Costa_Rica"{"crsjo"} + "America:Coyhaique"{"clcxq"} "America:Creston"{"cacfq"} "America:Cuiaba"{"brcgb"} "America:Curacao"{"ancur"} diff --git a/intl/tzdata/source/windowsZones.txt b/intl/tzdata/source/windowsZones.txt index de4f972352c..34c0baa36a4 100644 --- a/intl/tzdata/source/windowsZones.txt +++ b/intl/tzdata/source/windowsZones.txt @@ -362,7 +362,7 @@ windowsZones:table(nofallback){ } "Magallanes Standard Time"{ 001{"America/Punta_Arenas"} - CL{"America/Punta_Arenas"} + CL{"America/Punta_Arenas America/Coyhaique"} } "Marquesas Standard Time"{ 001{"Pacific/Marquesas"} diff --git a/intl/tzdata/source/zoneinfo64.txt b/intl/tzdata/source/zoneinfo64.txt index 4cbc0585131..3054a03b788 100644 --- a/intl/tzdata/source/zoneinfo64.txt +++ b/intl/tzdata/source/zoneinfo64.txt @@ -3,20 +3,20 @@ // License & terms of use: http://www.unicode.org/copyright.html //--------------------------------------------------------- // Build tool: tz2icu -// Build date: Thu Jan 30 14:17:55 2025 +// Build date: Wed Apr 9 14:46:22 2025 // tz database: ftp://ftp.iana.org/tz/ -// tz version: 2025a -// ICU version: 77.0.1 +// tz version: 2025b +// ICU version: 78.0.1 //--------------------------------------------------------- // >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! << // >> !!! >>> DO NOT EDIT <<< !!! << //--------------------------------------------------------- zoneinfo64:table(nofallback) { - TZVersion { "2025a" } + TZVersion { "2025b" } Zones:array { - /* ACT */ :int { 357 } //Z#0 - /* AET */ :int { 369 } //Z#1 + /* ACT */ :int { 358 } //Z#0 + /* AET */ :int { 370 } //Z#1 /* AGT */ :int { 64 } //Z#2 /* ART */ :int { 18 } //Z#3 /* AST */ :int { 60 } //Z#4 @@ -24,7 +24,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1830383032 } typeOffsets:intvector { -968, 0, 0, 0 } typeMap:bin { "01" } - links:intvector { 5, 6, 11, 13, 21, 22, 27, 38, 51, 52, 55, 347, 349, 517 } + links:intvector { 5, 6, 11, 13, 21, 22, 27, 38, 51, 52, 55, 348, 350, 518 } } //Z#5 /* Africa/Accra */ :int { 5 } //Z#6 /* Africa/Addis_Ababa */ :int { 48 } //Z#7 @@ -55,7 +55,7 @@ zoneinfo64:table(nofallback) { finalRule { "Egypt" } finalRaw:int { 7200 } finalYear:int { 2024 } - links:intvector { 3, 18, 403 } + links:intvector { 3, 18, 404 } } //Z#18 /* Africa/Casablanca */ :table { trans:intvector { -1773012580, -956361600, -950490000, -942019200, -761187600, -617241600, -605149200, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 504918000, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1557021600, 1560045600, 1587261600, 1590890400, 1618106400, 1621130400, 1648346400, 1651975200, 1679191200, 1682215200, 1710036000, 1713060000, 1740276000, 1743904800, 1771120800, 1774144800, 1801965600, 1804989600, 1832205600, 1835834400, 1863050400, 1866074400, 1893290400, 1896919200, 1924135200, 1927159200, 1954980000, 1958004000, 1985220000, 1988848800, 2016064800, 2019088800, 2046304800, 2049933600, 2077149600, 2080778400, 2107994400, 2111018400, 2138234400, 2141863200 } @@ -122,7 +122,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1924999818 } typeOffsets:intvector { 7818, 0, 7200, 0 } typeMap:bin { "01" } - links:intvector { 15, 17, 28, 29, 34, 40, 41, 43, 380 } + links:intvector { 15, 17, 28, 29, 34, 40, 41, 43, 381 } } //Z#43 /* Africa/Maseru */ :int { 30 } //Z#44 /* Africa/Mbabane */ :int { 30 } //Z#45 @@ -136,7 +136,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1946168836, -1309746600, -1261969200, -1041388200, -865305900 } typeOffsets:intvector { 8836, 0, 9000, 0, 9900, 0, 10800, 0 } typeMap:bin { "0103010203" } - links:intvector { 7, 9, 10, 23, 24, 32, 46, 48, 398, 518, 522, 527 } + links:intvector { 7, 9, 10, 23, 24, 32, 46, 48, 399, 519, 523, 528 } } //Z#48 /* Africa/Ndjamena */ :table { trans:intvector { -1830387612, 308703600, 321314400 } @@ -158,7 +158,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1577926364, -574902000, -568087200, -512175600, -504928800, -449888400, -441856800, -347158800, 378684000, 386463600, 402271200, 417999600, 433807200, 449622000, 465429600, 481590000, 496965600, 512953200, 528674400, 544230000, 560037600, 575852400, 591660000, 607388400, 623196000, 641775600, 844034400, 860108400, 875916000, 1352505600, 1364515200, 1382659200 } typeOffsets:intvector { 3164, 0, 3600, 0, 3600, 3600, 7200, 0 } typeMap:bin { "0102010201020103010201020102010201020102010201020103010203010203" } - links:intvector { 56, 535 } + links:intvector { 56, 536 } } //Z#56 /* Africa/Tunis */ :table { transPre32:intvector { -1, 1497764852 } @@ -180,7 +180,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -36000 } finalYear:int { 2008 } - links:intvector { 59, 80, 620 } + links:intvector { 59, 80, 621 } } //Z#59 /* America/Anchorage */ :table { transPre32:intvector { -1, 1069743569, -1, 2106016072 } @@ -190,10 +190,10 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - links:intvector { 4, 60, 619 } + links:intvector { 4, 60, 620 } } //Z#60 - /* America/Anguilla */ :int { 191 } //Z#61 - /* America/Antigua */ :int { 191 } //Z#62 + /* America/Anguilla */ :int { 192 } //Z#61 + /* America/Antigua */ :int { 192 } //Z#62 /* America/Araguaina */ :table { trans:intvector { -1767214032, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1350788400, 1361066400 } typeOffsets:intvector { -11568, 0, -10800, 0, -10800, 3600 } @@ -218,14 +218,14 @@ zoneinfo64:table(nofallback) { trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800, 1224385200, 1237082400 } typeOffsets:intvector { -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020103040304030403040104030403020304030403" } - links:intvector { 67, 102, 199 } + links:intvector { 67, 102, 200 } } //Z#67 /* America/Argentina/Jujuy */ :table { transPre32:intvector { -1, 1922870968 } trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 657086400, 669178800, 686721600, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800 } typeOffsets:intvector { -15672, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050203020504050403040504" } - links:intvector { 68, 144 } + links:intvector { 68, 145 } } //Z#68 /* America/Argentina/La_Rioja */ :table { transPre32:intvector { -1, 1922871340 } @@ -238,7 +238,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 655963200, 667796400, 687499200, 699418800, 719380800, 731469600, 938919600, 952052400, 1085281200, 1096171200, 1198983600, 1205632800 } typeOffsets:intvector { -16516, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040502030203020504030402040504" } - links:intvector { 70, 162 } + links:intvector { 70, 163 } } //Z#70 /* America/Argentina/Rio_Gallegos */ :table { transPre32:intvector { -1, 1922871908 } @@ -276,13 +276,13 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { -16392, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050405040504030402040504" } } //Z#76 - /* America/Aruba */ :int { 191 } //Z#77 + /* America/Aruba */ :int { 192 } //Z#77 /* America/Asuncion */ :table { trans:intvector { -1206389360, 86760000, 134017200, 181368000, 194497200, 212990400, 226033200, 244526400, 257569200, 276062400, 291783600, 307598400, 323406000, 339220800, 354942000, 370756800, 386478000, 402292800, 418014000, 433828800, 449636400, 465451200, 481172400, 496987200, 512708400, 528523200, 544244400, 560059200, 575866800, 591681600, 607402800, 625032000, 638938800, 654753600, 670474800, 686721600, 699418800, 718257600, 733546800, 749448000, 762318000, 780984000, 793767600, 812520000, 825649200, 844574400, 856666800, 876024000, 888721200, 907473600, 920775600, 938923200, 952225200, 970372800, 983674800, 1002427200, 1018148400, 1030852800, 1049598000, 1062907200, 1081047600, 1097985600, 1110682800, 1129435200, 1142132400, 1160884800, 1173582000, 1192939200, 1205031600, 1224388800, 1236481200, 1255838400, 1270954800, 1286078400, 1302404400, 1317528000, 1333854000, 1349582400, 1364094000, 1381032000, 1395543600, 1412481600, 1426993200, 1443931200, 1459047600, 1475380800, 1490497200, 1506830400, 1521946800, 1538884800, 1553396400, 1570334400, 1584846000, 1601784000, 1616900400, 1633233600, 1648350000, 1664683200, 1679799600, 1696132800, 1711249200, 1728187200, 1728961200 } typeOffsets:intvector { -13840, 0, -14400, 0, -14400, 3600, -10800, 0 } typeMap:bin { "01030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } } //Z#78 - /* America/Atikokan */ :int { 183 } //Z#79 + /* America/Atikokan */ :int { 184 } //Z#79 /* America/Atka */ :int { 59 } //Z#80 /* America/Bahia */ :table { trans:intvector { -1767216356, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1318734000, 1330221600 } @@ -309,7 +309,7 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { -21168, 0, -21600, 0, -21600, 1800, -21600, 3600 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020103010301" } } //Z#85 - /* America/Blanc-Sablon */ :int { 191 } //Z#86 + /* America/Blanc-Sablon */ :int { 192 } //Z#86 /* America/Boa_Vista */ :table { trans:intvector { -1767211040, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 938923200, 951620400, 970977600, 971578800 } typeOffsets:intvector { -14560, 0, -14400, 0, -14400, 3600 } @@ -360,7 +360,7 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { -12560, 0, -14400, 0, -10800, 0 } typeMap:bin { "0102" } } //Z#96 - /* America/Cayman */ :int { 183 } //Z#97 + /* America/Cayman */ :int { 184 } //Z#97 /* America/Chicago */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1563724800, -1551632400, -1538928000, -1520182800, -1504454400, -1491757200, -1473004800, -1459702800, -1441555200, -1428253200, -1410105600, -1396803600, -1378656000, -1365354000, -1347206400, -1333904400, -1315152000, -1301850000, -1283702400, -1270400400, -1252252800, -1238950800, -1220803200, -1207501200, -1189353600, -1176051600, -1157299200, -1144602000, -1125849600, -1112547600, -1094400000, -1081098000, -1067788800, -1045414800, -1031500800, -1018198800, -1000051200, -986749200, -967996800, -955299600, -936547200, -923245200, -905097600, -891795600, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -369,7 +369,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 98, 383, 384, 622 } + links:intvector { 98, 384, 385, 623 } } //Z#98 /* America/Chihuahua */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1270371600, 1288512000, 1301821200, 1319961600, 1333270800, 1351411200, 1365325200, 1382860800, 1396774800, 1414310400, 1428224400, 1445760000, 1459674000, 1477814400, 1491123600, 1509264000, 1522573200, 1540713600, 1554627600, 1572163200, 1586077200, 1603612800, 1617526800, 1635667200, 1648976400, 1667116800 } @@ -384,37 +384,43 @@ zoneinfo64:table(nofallback) { finalRaw:int { -25200 } finalYear:int { 2024 } } //Z#100 - /* America/Coral_Harbour */ :int { 183 } //Z#101 + /* America/Coral_Harbour */ :int { 184 } //Z#101 /* America/Cordoba */ :int { 67 } //Z#102 /* America/Costa_Rica */ :table { trans:intvector { -1545071027, 288770400, 297234000, 320220000, 328683600, 664264800, 678344400, 695714400, 700635600 } typeOffsets:intvector { -20173, 0, -21600, 0, -21600, 3600 } typeMap:bin { "010201020102010201" } } //Z#103 - /* America/Creston */ :int { 186 } //Z#104 + /* America/Coyhaique */ :table { + transPre32:intvector { -1, 1770462992 } + trans:intvector { -1892661435, -1688410800, -1619205435, -1593806400, -1335986235, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -736632000, -718056000, -713649600, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1494730800, 1502596800, 1526180400, 1534046400, 1554606000, 1567915200, 1586055600, 1599364800, 1617505200, 1630814400, 1648954800, 1662868800, 1680404400, 1693713600, 1712458800, 1725768000, 1742439600 } + typeOffsets:intvector { -17296, 0, -18000, 0, -18000, 3600, -16965, 0, -14400, 0, -14400, 3600, -10800, 0 } + typeMap:bin { "03010304030201020102010201020104010402010405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040506" } + } //Z#104 + /* America/Creston */ :int { 187 } //Z#105 /* America/Cuiaba */ :table { trans:intvector { -1767212140, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1192334400, 1203217200, 1224388800, 1234666800, 1255838400, 1266721200, 1287288000, 1298170800, 1318737600, 1330225200, 1350792000, 1361070000, 1382241600, 1392519600, 1413691200, 1424574000, 1445140800, 1456023600, 1476590400, 1487473200, 1508040000, 1518922800, 1541304000, 1550372400 } typeOffsets:intvector { -13460, 0, -14400, 0, -14400, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#105 - /* America/Curacao */ :int { 191 } //Z#106 + } //Z#106 + /* America/Curacao */ :int { 192 } //Z#107 /* America/Danmarkshavn */ :table { trans:intvector { -1686091520, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 820465200 } typeOffsets:intvector { -4480, 0, -10800, 0, -10800, 3600, 0, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#107 + } //Z#108 /* America/Dawson */ :table { transPre32:intvector { -1, 2105970356 } trans:intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -765381600, -147884400, -131554800, 120646800, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800, 1205056800, 1225616400, 1236506400, 1257066000, 1268560800, 1289120400, 1300010400, 1320570000, 1331460000, 1352019600, 1362909600, 1383469200, 1394359200, 1414918800, 1425808800, 1446368400, 1457863200, 1478422800, 1489312800, 1509872400, 1520762400, 1541322000, 1552212000, 1572771600, 1583661600, 1604214000 } typeOffsets:intvector { -33460, 0, -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600, -25200, 0 } typeMap:bin { "0102010201020103010405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040506" } - } //Z#108 + } //Z#109 /* America/Dawson_Creek */ :table { transPre32:intvector { -1, 1581085752 } trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 84013200 } typeOffsets:intvector { -28856, 0, -28800, 0, -28800, 3600, -25200, 0 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#109 + } //Z#110 /* America/Denver */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -1570374000, -1551628800, -1538924400, -1534089600, -880210800, -765388800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } @@ -423,8 +429,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -25200 } finalYear:int { 2008 } - links:intvector { 110, 206, 539, 547, 628 } - } //Z#110 + links:intvector { 111, 207, 540, 548, 629 } + } //Z#111 /* America/Detroit */ :table { trans:intvector { -2051202469, -1724083200, -880218000, -765396000, -684349200, -671047200, -80506740, -68666400, -52938000, -37216800, 104914800, 120636000, 126687600, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } typeOffsets:intvector { -19931, 0, -21600, 0, -18000, 0, -18000, 3600 } @@ -432,9 +438,9 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 111, 627 } - } //Z#111 - /* America/Dominica */ :int { 191 } //Z#112 + links:intvector { 112, 628 } + } //Z#112 + /* America/Dominica */ :int { 192 } //Z#113 /* America/Edmonton */ :table { trans:intvector { -1998663968, -1632063600, -1615132800, -1600614000, -1596816000, -1567954800, -1551628800, -1536505200, -1523203200, -1504450800, -1491753600, -1473001200, -1459699200, -880210800, -765388800, -715791600, -702489600, 73472400, 89193600, 104922000, 120643200, 136371600, 152092800, 167821200, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } typeOffsets:intvector { -27232, 0, -25200, 0, -25200, 3600 } @@ -442,31 +448,31 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -25200 } finalYear:int { 2008 } - links:intvector { 113, 226, 390 } - } //Z#113 + links:intvector { 114, 227, 391 } + } //Z#114 /* America/Eirunepe */ :table { trans:intvector { -1767208832, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 750834000, 761716800, 1214283600, 1384056000 } typeOffsets:intvector { -16768, 0, -18000, 0, -18000, 3600, -14400, 0 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010301" } - } //Z#114 + } //Z#115 /* America/El_Salvador */ :table { trans:intvector { -1546279392, 547020000, 559717200, 578469600, 591166800 } typeOffsets:intvector { -21408, 0, -21600, 0, -21600, 3600 } typeMap:bin { "0102010201" } - } //Z#115 - /* America/Ensenada */ :int { 218 } //Z#116 + } //Z#116 + /* America/Ensenada */ :int { 219 } //Z#117 /* America/Fort_Nelson */ :table { transPre32:intvector { -1, 1581086343 } trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800, 1205056800, 1225616400, 1236506400, 1257066000, 1268560800, 1289120400, 1300010400, 1320570000, 1331460000, 1352019600, 1362909600, 1383469200, 1394359200, 1414918800, 1425808800 } typeOffsets:intvector { -29447, 0, -28800, 0, -28800, 3600, -25200, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#117 - /* America/Fort_Wayne */ :int { 132 } //Z#118 + } //Z#118 + /* America/Fort_Wayne */ :int { 133 } //Z#119 /* America/Fortaleza */ :table { trans:intvector { -1767216360, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } typeOffsets:intvector { -9240, 0, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#119 + } //Z#120 /* America/Glace_Bay */ :table { trans:intvector { -2131646412, -1632074400, -1615143600, -880221600, -765399600, -526500000, -513198000, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -14388, 0, -14400, 0, -14400, 3600 } @@ -474,8 +480,8 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#120 - /* America/Godthab */ :int { 181 } //Z#121 + } //Z#121 + /* America/Godthab */ :int { 182 } //Z#122 /* America/Goose_Bay */ :table { transPre32:intvector { -1, 1581071396 } trans:intvector { -1632076148, -1615145348, -1096921748, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -119903400, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544593660, 562129260, 576043260, 594180060, 607492860, 625633260, 638942460, 657082860, 670996860, 688532460, 702446460, 719982060, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173585660, 1194145260, 1205035260, 1225594860, 1236484860, 1257044460, 1268539260, 1289098860, 1299988860, 1320555600, 1331445600, 1352005200 } @@ -484,7 +490,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2013 } - } //Z#122 + } //Z#123 /* America/Grand_Turk */ :table { transPre32:intvector { -1, 1770462768 } trans:intvector { -1827687170, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000, 1205046000, 1225605600, 1236495600, 1257055200, 1268550000, 1289109600, 1299999600, 1320559200, 1331449200, 1352008800, 1362898800, 1383458400, 1394348400, 1414908000, 1425798000, 1520751600, 1541311200 } @@ -493,25 +499,25 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2019 } - } //Z#123 - /* America/Grenada */ :int { 191 } //Z#124 - /* America/Guadeloupe */ :int { 191 } //Z#125 + } //Z#124 + /* America/Grenada */ :int { 192 } //Z#125 + /* America/Guadeloupe */ :int { 192 } //Z#126 /* America/Guatemala */ :table { trans:intvector { -1617040676, 123055200, 130914000, 422344800, 433054800, 669708000, 684219600, 1146376800, 1159678800 } typeOffsets:intvector { -21724, 0, -21600, 0, -21600, 3600 } typeMap:bin { "010201020102010201" } - } //Z#126 + } //Z#127 /* America/Guayaquil */ :table { transPre32:intvector { -1, 1770464856 } trans:intvector { -1230749160, 722926800, 728884800 } typeOffsets:intvector { -19160, 0, -18840, 0, -18000, 0, -18000, 3600 } typeMap:bin { "01020302" } - } //Z#127 + } //Z#128 /* America/Guyana */ :table { trans:intvector { -1843589241, -1730577600, 176096700, 701841600 } typeOffsets:intvector { -13959, 0, -14400, 0, -13500, 0, -10800, 0 } typeMap:bin { "01020301" } - } //Z#128 + } //Z#129 /* America/Halifax */ :table { trans:intvector { -2131645536, -1696276800, -1680469200, -1632074400, -1615143600, -1566763200, -1557090000, -1535486400, -1524949200, -1504468800, -1493413200, -1472414400, -1461963600, -1440964800, -1429390800, -1409515200, -1396731600, -1376856000, -1366491600, -1346616000, -1333832400, -1313956800, -1303678800, -1282507200, -1272661200, -1251057600, -1240088400, -1219608000, -1207429200, -1188763200, -1175979600, -1157313600, -1143925200, -1124049600, -1113771600, -1091390400, -1081026000, -1059854400, -1050786000, -1030910400, -1018126800, -999460800, -986677200, -965592000, -955227600, -935956800, -923173200, -904507200, -891723600, -880221600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -431546400, -418244400, -400096800, -386794800, -368647200, -355345200, -337197600, -323895600, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -15264, 0, -14400, 0, -14400, 3600 } @@ -519,8 +525,8 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2008 } - links:intvector { 129, 386 } - } //Z#129 + links:intvector { 130, 387 } + } //Z#130 /* America/Havana */ :table { transPre32:intvector { -1, 1770465464 } trans:intvector { -1402813824, -1311534000, -1300996800, -933534000, -925675200, -902084400, -893620800, -870030000, -862171200, -775681200, -767822400, -744231600, -736372800, -144702000, -134251200, -113425200, -102542400, -86295600, -72907200, -54154800, -41457600, -21495600, -5774400, 9954000, 25675200, 41403600, 57729600, 73458000, 87364800, 104907600, 118900800, 136357200, 150436800, 167806800, 183528000, 199256400, 215582400, 230706000, 247032000, 263365200, 276667200, 290581200, 308721600, 322030800, 340171200, 358318800, 371620800, 389768400, 403070400, 421218000, 434520000, 452667600, 466574400, 484117200, 498024000, 511333200, 529473600, 542782800, 560923200, 574837200, 592372800, 606286800, 623822400, 638946000, 655876800, 671000400, 687330000, 702450000, 718779600, 733899600, 750229200, 765349200, 781678800, 796798800, 813128400, 828853200, 844578000, 860302800, 876632400, 891147600, 909291600, 922597200, 941346000, 954651600, 972795600, 986101200, 1004245200, 1018155600, 1035694800, 1049605200, 1067144400, 1080450000, 1162098000, 1173589200, 1193547600, 1205643600, 1224997200, 1236488400, 1256446800, 1268542800, 1288501200, 1300597200, 1321160400, 1333256400, 1352005200, 1362891600, 1383454800 } @@ -529,13 +535,13 @@ zoneinfo64:table(nofallback) { finalRule { "Cuba" } finalRaw:int { -18000 } finalYear:int { 2014 } - links:intvector { 130, 397 } - } //Z#130 + links:intvector { 131, 398 } + } //Z#131 /* America/Hermosillo */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, -873828000, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400 } typeOffsets:intvector { -26632, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01030102010301020102010201" } - } //Z#131 + } //Z#132 /* America/Indiana/Indianapolis */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -900259200, -891795600, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -386787600, -368640000, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -544,8 +550,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 118, 132, 140, 515, 623 } - } //Z#132 + links:intvector { 119, 133, 141, 516, 624 } + } //Z#133 /* America/Indiana/Knox */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -195066000, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 1143961200, 1162105200, 1173600000, 1194159600 } @@ -554,8 +560,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 133, 148, 626 } - } //Z#133 + links:intvector { 134, 149, 627 } + } //Z#134 /* America/Indiana/Marengo */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -589392000, -576090000, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -564,7 +570,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - } //Z#134 + } //Z#135 /* America/Indiana/Petersburg */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 1143961200, 1162105200, 1173600000, 1194159600, 1205046000, 1225605600 } @@ -573,7 +579,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2009 } - } //Z#135 + } //Z#136 /* America/Indiana/Tell_City */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -68662800, -52934400, -37213200, -21484800, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194159600 } @@ -582,7 +588,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#136 + } //Z#137 /* America/Indiana/Vevay */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -495043200, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -591,7 +597,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - } //Z#137 + } //Z#138 /* America/Indiana/Vincennes */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -526492800, -513190800, -495043200, -481741200, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -289414800, -273686400, -260989200, -242236800, -226515600, -210787200, -195066000, -179337600, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194159600, 1205046000, 1225605600 } @@ -600,7 +606,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2009 } - } //Z#138 + } //Z#139 /* America/Indiana/Winamac */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194156000, 1205046000, 1225605600 } @@ -609,8 +615,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2009 } - } //Z#139 - /* America/Indianapolis */ :int { 132 } //Z#140 + } //Z#140 + /* America/Indianapolis */ :int { 133 } //Z#141 /* America/Inuvik */ :table { trans:intvector { -536457600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } typeOffsets:intvector { 0, 0, -28800, 0, -28800, 3600, -25200, 0, -25200, 3600 } @@ -618,7 +624,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -25200 } finalYear:int { 2008 } - } //Z#141 + } //Z#142 /* America/Iqaluit */ :table { trans:intvector { -865296000, -765396000, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } @@ -626,15 +632,15 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 142, 184 } - } //Z#142 + links:intvector { 143, 185 } + } //Z#143 /* America/Jamaica */ :table { trans:intvector { -1827687170, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600 } typeOffsets:intvector { -18430, 0, -18000, 0, -18000, 3600 } typeMap:bin { "010201020102010201020102010201020102010201" } - links:intvector { 143, 532 } - } //Z#143 - /* America/Jujuy */ :int { 68 } //Z#144 + links:intvector { 144, 533 } + } //Z#144 + /* America/Jujuy */ :int { 68 } //Z#145 /* America/Juneau */ :table { transPre32:intvector { -1, 1069743569, -1, 2106012357 } trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341402400, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } @@ -643,7 +649,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - } //Z#145 + } //Z#146 /* America/Kentucky/Louisville */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1535904000, -1525280400, -905097600, -891795600, -880214400, -765392400, -747251940, -744224400, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -266432400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -652,8 +658,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 146, 153 } - } //Z#146 + links:intvector { 147, 154 } + } //Z#147 /* America/Kentucky/Monticello */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -662,20 +668,20 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - } //Z#147 - /* America/Knox_IN */ :int { 133 } //Z#148 - /* America/Kralendijk */ :int { 191 } //Z#149 + } //Z#148 + /* America/Knox_IN */ :int { 134 } //Z#149 + /* America/Kralendijk */ :int { 192 } //Z#150 /* America/La_Paz */ :table { trans:intvector { -1205954844, -1192307244 } typeOffsets:intvector { -16356, 0, -16356, 3600, -14400, 0 } typeMap:bin { "0102" } - } //Z#150 + } //Z#151 /* America/Lima */ :table { transPre32:intvector { -1, 1770464188 } trans:intvector { -1938538284, -1009825200, -1002052800, -986756400, -971035200, -955306800, -939585600, 504939600, 512712000, 536475600, 544248000, 631170000, 638942400, 757400400, 765172800 } typeOffsets:intvector { -18492, 0, -18516, 0, -18000, 0, -18000, 3600 } typeMap:bin { "01020302030203020302030203020302" } - } //Z#151 + } //Z#152 /* America/Los_Angeles */ :table { transPre32:intvector { -1, 1577327296 } trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -765385200, -687967140, -662655600, -620838000, -608137200, -589388400, -576082800, -557938800, -544633200, -526489200, -513183600, -495039600, -481734000, -463590000, -450284400, -431535600, -418230000, -400086000, -386780400, -368636400, -355330800, -337186800, -323881200, -305737200, -292431600, -273682800, -260982000, -242233200, -226508400, -210783600, -195058800, -179334000, -163609200, -147884400, -131554800, -116434800, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } @@ -684,33 +690,33 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -28800 } finalYear:int { 2008 } - links:intvector { 152, 552, 553, 629, 630 } - } //Z#152 - /* America/Louisville */ :int { 146 } //Z#153 - /* America/Lower_Princes */ :int { 191 } //Z#154 + links:intvector { 153, 553, 554, 630, 631 } + } //Z#153 + /* America/Louisville */ :int { 147 } //Z#154 + /* America/Lower_Princes */ :int { 192 } //Z#155 /* America/Maceio */ :table { trans:intvector { -1767217028, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } typeOffsets:intvector { -8572, 0, -10800, 0, -10800, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#155 + } //Z#156 /* America/Managua */ :table { transPre32:intvector { -1, 1770466404 } trans:intvector { -1121105688, 105084000, 161758800, 290584800, 299134800, 322034400, 330584400, 694260000, 717310800, 725868000, 852094800, 1113112800, 1128229200, 1146384000, 1159682400 } typeOffsets:intvector { -20708, 0, -21600, 0, -21600, 3600, -20712, 0, -18000, 0 } typeMap:bin { "03010401020102010401040102010201" } - } //Z#156 + } //Z#157 /* America/Manaus */ :table { trans:intvector { -1767211196, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 750830400, 761713200 } typeOffsets:intvector { -14404, 0, -14400, 0, -14400, 3600 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 157, 379 } - } //Z#157 - /* America/Marigot */ :int { 191 } //Z#158 + links:intvector { 158, 380 } + } //Z#158 + /* America/Marigot */ :int { 192 } //Z#159 /* America/Martinique */ :table { trans:intvector { -1851537340, 323841600, 338958000 } typeOffsets:intvector { -14660, 0, -14400, 0, -14400, 3600 } typeMap:bin { "010201" } - } //Z#159 + } //Z#160 /* America/Matamoros */ :table { trans:intvector { -1514743200, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1268553600, 1289113200 } typeOffsets:intvector { -23400, 0, -21600, 0, -21600, 3600 } @@ -718,14 +724,14 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2011 } - } //Z#160 + } //Z#161 /* America/Mazatlan */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, -873828000, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1270371600, 1288512000, 1301821200, 1319961600, 1333270800, 1351411200, 1365325200, 1382860800, 1396774800, 1414310400, 1428224400, 1445760000, 1459674000, 1477814400, 1491123600, 1509264000, 1522573200, 1540713600, 1554627600, 1572163200, 1586077200, 1603612800, 1617526800, 1635667200, 1648976400, 1667116800 } typeOffsets:intvector { -25540, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01030102010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 161, 541 } - } //Z#161 - /* America/Mendoza */ :int { 70 } //Z#162 + links:intvector { 162, 542 } + } //Z#162 + /* America/Mendoza */ :int { 70 } //Z#163 /* America/Menominee */ :table { transPre32:intvector { -1, 1635207523 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -116438400, -100112400, -21484800, 104914800, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -734,12 +740,12 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#163 + } //Z#164 /* America/Merida */ :table { trans:intvector { -1514743200, 378201600, 405068400, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1270368000, 1288508400, 1301817600, 1319958000, 1333267200, 1351407600, 1365321600, 1382857200, 1396771200, 1414306800, 1428220800, 1445756400, 1459670400, 1477810800, 1491120000, 1509260400, 1522569600, 1540710000, 1554624000, 1572159600, 1586073600, 1603609200, 1617523200, 1635663600, 1648972800, 1667113200 } typeOffsets:intvector { -21508, 0, -21600, 0, -21600, 3600, -18000, 0 } typeMap:bin { "010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#164 + } //Z#165 /* America/Metlakatla */ :table { transPre32:intvector { -1, 1069743569, -1, 2106011674 } trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 1446372000, 1457866800, 1478426400, 1489316400, 1509876000, 1520766000, 1541325600, 1547978400, 1552215600, 1572775200 } @@ -748,13 +754,13 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2020 } - } //Z#165 + } //Z#166 /* America/Mexico_City */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, -975261600, -963169200, -917114400, -907354800, -821901600, -810068400, -627501600, -612990000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1270368000, 1288508400, 1301817600, 1319958000, 1333267200, 1351407600, 1365321600, 1382857200, 1396771200, 1414306800, 1428220800, 1445756400, 1459670400, 1477810800, 1491120000, 1509260400, 1522569600, 1540710000, 1554624000, 1572159600, 1586073600, 1603609200, 1617523200, 1635663600, 1648972800, 1667113200 } typeOffsets:intvector { -23796, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } typeMap:bin { "0103010201030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - links:intvector { 166, 542 } - } //Z#166 + links:intvector { 167, 543 } + } //Z#167 /* America/Miquelon */ :table { trans:intvector { -1847650520, 326001600, 544597200, 562132800, 576046800, 594187200, 607496400, 625636800, 638946000, 657086400, 671000400, 688536000, 702450000, 719985600, 733899600, 752040000, 765349200, 783489600, 796798800, 814939200, 828853200, 846388800, 860302800, 877838400, 891752400, 909288000, 923202000, 941342400, 954651600, 972792000, 986101200, 1004241600, 1018155600, 1035691200, 1049605200, 1067140800, 1081054800, 1099195200, 1112504400, 1130644800, 1143954000, 1162094400, 1173589200, 1194148800 } typeOffsets:intvector { -13480, 0, -14400, 0, -10800, 0, -10800, 3600 } @@ -762,7 +768,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -10800 } finalYear:int { 2008 } - } //Z#167 + } //Z#168 /* America/Moncton */ :table { transPre32:intvector { -1, 1579085244 } trans:intvector { -2131642800, -1632074400, -1615143600, -1153681200, -1145822400, -1122231600, -1114372800, -1090782000, -1082923200, -1059332400, -1051473600, -1027882800, -1020024000, -996433200, -988574400, -965674800, -955396800, -934743600, -923947200, -904503600, -891892800, -880221600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -620848800, -608151600, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -463600800, -450298800, -431546400, -418244400, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173592800, 1194152400 } @@ -771,20 +777,20 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#168 + } //Z#169 /* America/Monterrey */ :table { trans:intvector { -1514743200, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1270368000, 1288508400, 1301817600, 1319958000, 1333267200, 1351407600, 1365321600, 1382857200, 1396771200, 1414306800, 1428220800, 1445756400, 1459670400, 1477810800, 1491120000, 1509260400, 1522569600, 1540710000, 1554624000, 1572159600, 1586073600, 1603609200, 1617523200, 1635663600, 1648972800, 1667113200 } typeOffsets:intvector { -24076, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } typeMap:bin { "0103010201030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - } //Z#169 + } //Z#170 /* America/Montevideo */ :table { trans:intvector { -1567455309, -1459627200, -1443819600, -1428006600, -1412283600, -1396470600, -1380747600, -1141590600, -1128286800, -1110141000, -1096837200, -1078691400, -1065387600, -1047241800, -1033938000, -1015187400, -1002488400, -983737800, -971038800, -954707400, -938984400, -920838600, -907534800, -896819400, -853621200, -845847000, -334789200, -319671000, -314226000, -309996000, -149720400, -134604000, -50446800, -34205400, 9860400, 14176800, 72846000, 80100000, 127278000, 132111000, 147234600, 156913200, 165376800, 219812400, 226461600, 250052400, 257911200, 282711600, 289360800, 294202800, 322020000, 566449200, 573012000, 597812400, 605066400, 625633200, 635911200, 656478000, 667965600, 688532400, 699415200, 719377200, 730864800, 1095562800, 1111896000, 1128834000, 1142136000, 1159678800, 1173585600, 1191733200, 1205035200, 1223182800, 1236484800, 1254632400, 1268539200, 1286082000, 1299988800, 1317531600, 1331438400, 1349586000, 1362888000, 1381035600, 1394337600, 1412485200, 1425787200 } typeOffsets:intvector { -13491, 0, -14400, 0, -12600, 0, -12600, 1800, -10800, 0, -10800, 1800, -10800, 3600, -10800, 5400 } typeMap:bin { "01030203020302030203020302030203020302030203020305040504060406040504060406040705040604060406040604060406040604060406040604060406040604060406040604060406040604060406040604" } - } //Z#170 - /* America/Montreal */ :int { 219 } //Z#171 - /* America/Montserrat */ :int { 191 } //Z#172 - /* America/Nassau */ :int { 219 } //Z#173 + } //Z#171 + /* America/Montreal */ :int { 220 } //Z#172 + /* America/Montserrat */ :int { 192 } //Z#173 + /* America/Nassau */ :int { 220 } //Z#174 /* America/New_York */ :table { transPre32:intvector { -1, 1577316496 } trans:intvector { -1633280400, -1615140000, -1601830800, -1583690400, -1570381200, -1551636000, -1536512400, -1523210400, -1504458000, -1491760800, -1473008400, -1459706400, -1441558800, -1428256800, -1410109200, -1396807200, -1378659600, -1365357600, -1347210000, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1189357200, -1176055200, -1157302800, -1144605600, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -923248800, -905101200, -891799200, -880218000, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -639597600, -620845200, -608148000, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -793,9 +799,9 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 174, 402, 624 } - } //Z#174 - /* America/Nipigon */ :int { 219 } //Z#175 + links:intvector { 175, 403, 625 } + } //Z#175 + /* America/Nipigon */ :int { 220 } //Z#176 /* America/Nome */ :table { transPre32:intvector { -1, 1069743569, -1, 2106019794 } trans:intvector { -880196400, -765374400, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } @@ -804,13 +810,13 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - } //Z#176 + } //Z#177 /* America/Noronha */ :table { trans:intvector { -1767217820, -1206961200, -1191366000, -1175378400, -1159830000, -633823200, -622072800, -602287200, -591836400, -570751200, -560214000, -539128800, -531356400, -191368800, -184201200, -155167200, -150073200, -128901600, -121129200, -99957600, -89593200, -68421600, -57970800, 499744800, 511232400, 530589600, 540262800, 562125600, 571194000, 592970400, 602038800, 624420000, 634698000, 938916000, 951613200, 970970400, 971571600, 1003024800, 1013907600 } typeOffsets:intvector { -7780, 0, -7200, 0, -7200, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 177, 377 } - } //Z#177 + links:intvector { 178, 378 } + } //Z#178 /* America/North_Dakota/Beulah */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200, 1205053200, 1225612800, 1236502800, 1257062400, 1268557200, 1289116800, 1300003200, 1320562800 } @@ -819,7 +825,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2012 } - } //Z#178 + } //Z#179 /* America/North_Dakota/Center */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -828,7 +834,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#179 + } //Z#180 /* America/North_Dakota/New_Salem */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -837,7 +843,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#180 + } //Z#181 /* America/Nuuk */ :table { trans:intvector { -1686083584, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396141200, 1414285200, 1427590800, 1445734800, 1459040400, 1477789200, 1490490000, 1509238800, 1521939600, 1540688400, 1553994000, 1572138000, 1585443600, 1603587600, 1616893200, 1635642000, 1648342800, 1667091600, 1679792400, 1711846800, 1729990800 } typeOffsets:intvector { -12416, 0, -10800, 0, -10800, 3600, -7200, 0, -7200, 3600 } @@ -845,8 +851,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { -7200 } finalYear:int { 2025 } - links:intvector { 121, 181 } - } //Z#181 + links:intvector { 122, 182 } + } //Z#182 /* America/Ojinaga */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1268557200, 1289116800, 1300006800, 1320566400, 1331456400, 1352016000, 1362906000, 1383465600, 1394355600, 1414915200, 1425805200, 1446364800, 1457859600, 1478419200, 1489309200, 1509868800, 1520758800, 1541318400, 1552208400, 1572768000, 1583658000, 1604217600, 1615712400, 1636272000, 1647162000, 1667116800, 1678608000, 1699167600 } typeOffsets:intvector { -25060, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } @@ -854,27 +860,27 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2024 } - } //Z#182 + } //Z#183 /* America/Panama */ :table { transPre32:intvector { -1, 1770464784 } trans:intvector { -1946918424 } typeOffsets:intvector { -19088, 0, -19176, 0, -18000, 0 } typeMap:bin { "0102" } - links:intvector { 79, 97, 101, 183, 401 } - } //Z#183 - /* America/Pangnirtung */ :int { 142 } //Z#184 + links:intvector { 79, 97, 101, 184, 402 } + } //Z#184 + /* America/Pangnirtung */ :int { 143 } //Z#185 /* America/Paramaribo */ :table { trans:intvector { -1861906760, -1104524348, -765317964, 465449400 } typeOffsets:intvector { -13240, 0, -13252, 0, -13236, 0, -12600, 0, -10800, 0 } typeMap:bin { "01020304" } - } //Z#185 + } //Z#186 /* America/Phoenix */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -820519140, -812653140, -796845540, -84380400, -68659200 } typeOffsets:intvector { -26898, 0, -25200, 0, -25200, 3600 } typeMap:bin { "0102010201020102010201" } - links:intvector { 104, 186, 538, 549, 621 } - } //Z#186 + links:intvector { 105, 187, 539, 550, 622 } + } //Z#187 /* America/Port-au-Prince */ :table { transPre32:intvector { -1, 1770463056 } trans:intvector { -1670483460, 421218000, 436334400, 452062800, 467784000, 483512400, 499233600, 514962000, 530683200, 546411600, 562132800, 576050400, 594194400, 607500000, 625644000, 638949600, 657093600, 671004000, 688543200, 702453600, 719992800, 733903200, 752047200, 765352800, 783496800, 796802400, 814946400, 828856800, 846396000, 860306400, 877845600, 1112504400, 1130644800, 1143954000, 1162094400, 1331449200, 1352008800, 1362898800, 1383458400, 1394348400, 1414908000, 1425798000, 1446357600, 1489302000, 1509861600 } @@ -883,28 +889,28 @@ zoneinfo64:table(nofallback) { finalRule { "Haiti" } finalRaw:int { -18000 } finalYear:int { 2018 } - } //Z#187 - /* America/Port_of_Spain */ :int { 191 } //Z#188 - /* America/Porto_Acre */ :int { 198 } //Z#189 + } //Z#188 + /* America/Port_of_Spain */ :int { 192 } //Z#189 + /* America/Porto_Acre */ :int { 199 } //Z#190 /* America/Porto_Velho */ :table { trans:intvector { -1767210264, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200 } typeOffsets:intvector { -15336, 0, -14400, 0, -14400, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } - } //Z#190 + } //Z#191 /* America/Puerto_Rico */ :table { transPre32:intvector { -1, 2061931961 } trans:intvector { -873057600, -765399600 } typeOffsets:intvector { -15865, 0, -14400, 0, -14400, 3600 } typeMap:bin { "010201" } - links:intvector { 61, 62, 77, 86, 106, 112, 124, 125, 149, 154, 158, 172, 188, 191, 208, 210, 211, 212, 213, 220, 222, 551 } - } //Z#191 + links:intvector { 61, 62, 77, 86, 107, 113, 125, 126, 150, 155, 159, 173, 189, 192, 209, 211, 212, 213, 214, 221, 223, 552 } + } //Z#192 /* America/Punta_Arenas */ :table { transPre32:intvector { -1, 1770462716 } trans:intvector { -1892661435, -1688410800, -1619205435, -1593806400, -1335986235, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -736632000, -718056000, -713649600, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1480820400 } typeOffsets:intvector { -17020, 0, -18000, 0, -18000, 3600, -16965, 0, -14400, 0, -14400, 3600, -10800, 0 } typeMap:bin { "030103040302010201020102010201040104020104050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040506" } - } //Z#192 - /* America/Rainy_River */ :int { 224 } //Z#193 + } //Z#193 + /* America/Rainy_River */ :int { 225 } //Z#194 /* America/Rankin_Inlet */ :table { trans:intvector { -410227200, 73468800, 89190000, 104918400, 120639600, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0 } @@ -912,18 +918,18 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#194 + } //Z#195 /* America/Recife */ :table { trans:intvector { -1767217224, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 971575200, 1003028400, 1013911200 } typeOffsets:intvector { -8376, 0, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#195 + } //Z#196 /* America/Regina */ :table { trans:intvector { -2030202084, -1632063600, -1615132800, -1251651600, -1238349600, -1220202000, -1206900000, -1188752400, -1175450400, -1156698000, -1144000800, -1125248400, -1111946400, -1032714000, -1016992800, -1001264400, -986148000, -969814800, -954093600, -937760400, -922039200, -906310800, -890589600, -880210800, -765388800, -748450800, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -620838000, -608140800, -589388400, -576086400, -557938800, -544636800, -526489200, -513187200, -495039600, -481737600, -463590000, -450288000, -431535600, -418233600, -400086000, -386784000, -337186800, -321465600, -305737200 } typeOffsets:intvector { -25116, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - links:intvector { 196, 388, 393 } - } //Z#196 + links:intvector { 197, 389, 394 } + } //Z#197 /* America/Resolute */ :table { trans:intvector { -704937600, 73468800, 89190000, 104918400, 120639600, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0 } @@ -931,20 +937,20 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#197 + } //Z#198 /* America/Rio_Branco */ :table { trans:intvector { -1767209328, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 1214283600, 1384056000 } typeOffsets:intvector { -16272, 0, -18000, 0, -18000, 3600, -14400, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010301" } - links:intvector { 189, 198, 376 } - } //Z#198 - /* America/Rosario */ :int { 67 } //Z#199 - /* America/Santa_Isabel */ :int { 218 } //Z#200 + links:intvector { 190, 199, 377 } + } //Z#199 + /* America/Rosario */ :int { 67 } //Z#200 + /* America/Santa_Isabel */ :int { 219 } //Z#201 /* America/Santarem */ :table { trans:intvector { -1767212472, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 1214280000 } typeOffsets:intvector { -13128, 0, -14400, 0, -14400, 3600, -10800, 0 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020103" } - } //Z#201 + } //Z#202 /* America/Santiago */ :table { trans:intvector { -1892661435, -1688410800, -1619205435, -1593806400, -1335986235, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -740520000, -736635600, -718056000, -713649600, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1494730800, 1502596800, 1526180400, 1534046400, 1554606000, 1567915200, 1586055600, 1599364800, 1617505200, 1630814400, 1648954800, 1662868800, 1680404400, 1693713600 } typeOffsets:intvector { -16965, 0, -18000, 0, -18000, 3600, -14400, 0, -14400, 3600 } @@ -952,20 +958,20 @@ zoneinfo64:table(nofallback) { finalRule { "Chile" } finalRaw:int { -14400 } finalYear:int { 2024 } - links:intvector { 202, 395 } - } //Z#202 + links:intvector { 203, 396 } + } //Z#203 /* America/Santo_Domingo */ :table { transPre32:intvector { -1, 1770462472 } trans:intvector { -1159773600, -100119600, -89668800, -5770800, 4422600, 25678800, 33193800, 57733200, 64816200, 89182800, 96438600, 120632400, 127974600, 152082000, 972799200, 975823200 } typeOffsets:intvector { -16776, 0, -18000, 0, -18000, 1800, -18000, 3600, -16800, 0, -14400, 0 } typeMap:bin { "0401030102010201020102010201050105" } - } //Z#203 + } //Z#204 /* America/Sao_Paulo */ :table { trans:intvector { -1767214412, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -195426000, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1066532400, 1076810400, 1099364400, 1108864800, 1129431600, 1140314400, 1162695600, 1172368800, 1192330800, 1203213600, 1224385200, 1234663200, 1255834800, 1266717600, 1287284400, 1298167200, 1318734000, 1330221600, 1350788400, 1361066400, 1382238000, 1392516000, 1413687600, 1424570400, 1445137200, 1456020000, 1476586800, 1487469600, 1508036400, 1518919200, 1541300400, 1550368800 } typeOffsets:intvector { -11188, 0, -10800, 0, -10800, 3600 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 204, 374, 378 } - } //Z#204 + links:intvector { 205, 375, 379 } + } //Z#205 /* America/Scoresbysund */ :table { trans:intvector { -1686090728, 323841600, 338961600, 354679200, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396141200, 1414285200, 1427590800, 1445734800, 1459040400, 1477789200, 1490490000, 1509238800, 1521939600, 1540688400, 1553994000, 1572138000, 1585443600, 1603587600, 1616893200, 1635642000, 1648342800, 1667091600, 1679792400, 1698541200, 1711846800, 1729990800 } typeOffsets:intvector { -5272, 0, -7200, 0, -7200, 3600, -3600, 0, -3600, 3600 } @@ -973,8 +979,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { -7200 } finalYear:int { 2025 } - } //Z#205 - /* America/Shiprock */ :int { 110 } //Z#206 + } //Z#206 + /* America/Shiprock */ :int { 111 } //Z#207 /* America/Sitka */ :table { transPre32:intvector { -1, 1069743569, -1, 2106012569 } trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } @@ -983,8 +989,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - } //Z#207 - /* America/St_Barthelemy */ :int { 191 } //Z#208 + } //Z#208 + /* America/St_Barthelemy */ :int { 192 } //Z#209 /* America/St_Johns */ :table { trans:intvector { -1664130548, -1650137348, -1632076148, -1615145348, -1598650148, -1590100148, -1567286948, -1551565748, -1535837348, -1520116148, -1503782948, -1488666548, -1472333348, -1457216948, -1440883748, -1425767348, -1409434148, -1394317748, -1377984548, -1362263348, -1346534948, -1330813748, -1314480548, -1299364148, -1283030948, -1267914548, -1251581348, -1236464948, -1220131748, -1205015348, -1188682148, -1172960948, -1156627748, -1141511348, -1125178148, -1110061748, -1096921748, -1093728600, -1078612200, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -116447400, -100121400, -84393000, -68671800, -52943400, -37222200, -21493800, -5772600, 9955800, 25677000, 41405400, 57731400, 73459800, 89181000, 104909400, 120630600, 136359000, 152080200, 167808600, 183529800, 199258200, 215584200, 230707800, 247033800, 262762200, 278483400, 294211800, 309933000, 325661400, 341382600, 357111000, 372832200, 388560600, 404886600, 420010200, 436336200, 452064600, 467785800, 483514200, 499235400, 514963800, 530685000, 544591860, 562127460, 576041460, 594178260, 607491060, 625631460, 638940660, 657081060, 670995060, 688530660, 702444660, 719980260, 733894260, 752034660, 765343860, 783484260, 796793460, 814933860, 828847860, 846383460, 860297460, 877833060, 891747060, 909282660, 923196660, 941337060, 954646260, 972786660, 986095860, 1004236260, 1018150260, 1035685860, 1049599860, 1067135460, 1081049460, 1099189860, 1112499060, 1130639460, 1143948660, 1162089060, 1173583860, 1194143460, 1205033460, 1225593060, 1236483060, 1257042660, 1268537460, 1289097060, 1299987060, 1320553800, 1331443800, 1352003400 } typeOffsets:intvector { -12652, 0, -12652, 3600, -12600, 0, -12600, 3600, -12600, 7200 } @@ -992,22 +998,22 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -12600 } finalYear:int { 2013 } - links:intvector { 209, 382, 391 } - } //Z#209 - /* America/St_Kitts */ :int { 191 } //Z#210 - /* America/St_Lucia */ :int { 191 } //Z#211 - /* America/St_Thomas */ :int { 191 } //Z#212 - /* America/St_Vincent */ :int { 191 } //Z#213 + links:intvector { 210, 383, 392 } + } //Z#210 + /* America/St_Kitts */ :int { 192 } //Z#211 + /* America/St_Lucia */ :int { 192 } //Z#212 + /* America/St_Thomas */ :int { 192 } //Z#213 + /* America/St_Vincent */ :int { 192 } //Z#214 /* America/Swift_Current */ :table { trans:intvector { -2030201320, -1632063600, -1615132800, -880210800, -765388800, -747241200, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -400086000, -384364800, -337186800, -321465600, -305737200, -292435200, -273682800, -260985600, 73472400 } typeOffsets:intvector { -25880, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01020102010201020102010201020102010201020103" } - } //Z#214 + } //Z#215 /* America/Tegucigalpa */ :table { trans:intvector { -1538503868, 547020000, 559717200, 578469600, 591166800, 1146981600, 1154926800 } typeOffsets:intvector { -20932, 0, -21600, 0, -21600, 3600 } typeMap:bin { "01020102010201" } - } //Z#215 + } //Z#216 /* America/Thule */ :table { trans:intvector { -1686079492, 670399200, 686120400, 701848800, 717570000, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -16508, 0, -14400, 0, -14400, 3600 } @@ -1015,8 +1021,8 @@ zoneinfo64:table(nofallback) { finalRule { "Thule" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#216 - /* America/Thunder_Bay */ :int { 219 } //Z#217 + } //Z#217 + /* America/Thunder_Bay */ :int { 220 } //Z#218 /* America/Tijuana */ :table { trans:intvector { -1514739600, -1451667600, -1343145600, -1234803600, -1222963200, -1207242000, -873820800, -761418000, -686073600, -661539600, -620755200, -608144400, -589384800, -576082800, -557935200, -544633200, -495039600, -481734000, -463590000, -450284400, -431535600, -418230000, -400086000, -386780400, -368636400, -355330800, -337186800, -323881200, -305737200, -292431600, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1175421600, 1193562000, 1207476000, 1225011600, 1238925600, 1256461200, 1268560800, 1289120400 } typeOffsets:intvector { -28084, 0, -28800, 0, -28800, 3600, -25200, 0 } @@ -1024,8 +1030,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -28800 } finalYear:int { 2011 } - links:intvector { 116, 200, 218, 540 } - } //Z#218 + links:intvector { 117, 201, 219, 541 } + } //Z#219 /* America/Toronto */ :table { transPre32:intvector { -1, 1928231148 } trans:intvector { -1632070800, -1615140000, -1601753400, -1583697600, -1567357200, -1554667200, -1534698000, -1524074400, -1503248400, -1492365600, -1471798800, -1460916000, -1440954000, -1428861600, -1409504400, -1397412000, -1378054800, -1365962400, -1346605200, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1188752400, -1176055200, -1157302800, -1144000800, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -634154400, -620845200, -602704800, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -450295200, -431542800, -418240800, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -1034,9 +1040,9 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 171, 173, 175, 217, 219, 389 } - } //Z#219 - /* America/Tortola */ :int { 191 } //Z#220 + links:intvector { 172, 174, 176, 218, 220, 390 } + } //Z#220 + /* America/Tortola */ :int { 192 } //Z#221 /* America/Vancouver */ :table { transPre32:intvector { -1, 1581086444 } trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -747237600, -733935600, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } @@ -1045,16 +1051,16 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -28800 } finalYear:int { 2008 } - links:intvector { 221, 392 } - } //Z#221 - /* America/Virgin */ :int { 191 } //Z#222 + links:intvector { 222, 393 } + } //Z#222 + /* America/Virgin */ :int { 192 } //Z#223 /* America/Whitehorse */ :table { transPre32:intvector { -1, 2105969308 } trans:intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -765381600, -147884400, -131554800, -121273200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800, 1205056800, 1225616400, 1236506400, 1257066000, 1268560800, 1289120400, 1300010400, 1320570000, 1331460000, 1352019600, 1362909600, 1383469200, 1394359200, 1414918800, 1425808800, 1446368400, 1457863200, 1478422800, 1489312800, 1509872400, 1520762400, 1541322000, 1552212000, 1572771600, 1583661600, 1604214000 } typeOffsets:intvector { -32412, 0, -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600, -25200, 0 } typeMap:bin { "0102010201020103010405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040506" } - links:intvector { 223, 394 } - } //Z#223 + links:intvector { 224, 395 } + } //Z#224 /* America/Winnipeg */ :table { transPre32:intvector { -1, 1692709012 } trans:intvector { -1694368800, -1681671600, -1632067200, -1615136400, -1029686400, -1018198800, -880214400, -765392400, -746035200, -732733200, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620755200, -607626000, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -292438800, -210787200, -198090000, -116438400, -100108800, -84384000, -68659200, -52934400, -37209600, -21484800, -5760000, 9964800, 25689600, 41414400, 57744000, 73468800, 89193600, 104918400, 120643200, 136368000, 152092800, 167817600, 183542400, 199267200, 215596800, 230716800, 247046400, 262771200, 278496000, 294220800, 309945600, 325670400, 341395200, 357120000, 372844800, 388569600, 404899200, 420019200, 436348800, 452073600, 467798400, 483523200, 499248000, 514972800, 530697600, 544608000, 562147200, 576057600, 594201600, 607507200, 625651200, 638956800, 657100800, 671011200, 688550400, 702460800, 720000000, 733910400, 752054400, 765360000, 783504000, 796809600, 814953600, 828864000, 846403200, 860313600, 877852800, 891763200, 909302400, 923212800, 941356800, 954662400, 972806400, 986112000, 1004256000, 1018166400, 1035705600, 1049616000, 1067155200, 1081065600, 1099209600, 1112515200, 1130659200, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -1063,8 +1069,8 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 193, 224, 387 } - } //Z#224 + links:intvector { 194, 225, 388 } + } //Z#225 /* America/Yakutat */ :table { transPre32:intvector { -1, 1069743569, -1, 2106013631 } trans:intvector { -880203600, -765381600, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 152100000, 162385200, 183549600, 199278000, 215604000, 230727600, 247053600, 262782000, 278503200, 294231600, 309952800, 325681200, 341402400, 357130800, 372852000, 388580400, 404906400, 420030000, 436356000, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } @@ -1073,19 +1079,19 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - } //Z#225 - /* America/Yellowknife */ :int { 113 } //Z#226 + } //Z#226 + /* America/Yellowknife */ :int { 114 } //Z#227 /* Antarctica/Casey */ :table { trans:intvector { -31536000, 1255802400, 1267714800, 1319738400, 1329843600, 1477065600, 1520701200, 1538856000, 1552752000, 1570129200, 1583596800, 1601740860, 1615640400, 1633190460, 1647090000, 1664640060, 1678291200 } typeOffsets:intvector { 0, 0, 28800, 0, 39600, 0 } typeMap:bin { "0102010201020102010201020102010201" } - } //Z#227 + } //Z#228 /* Antarctica/Davis */ :table { trans:intvector { -409190400, -163062000, -28857600, 1255806000, 1268251200, 1319742000, 1329854400 } typeOffsets:intvector { 0, 0, 18000, 0, 25200, 0 } typeMap:bin { "02000201020102" } - } //Z#228 - /* Antarctica/DumontDUrville */ :int { 587 } //Z#229 + } //Z#229 + /* Antarctica/DumontDUrville */ :int { 588 } //Z#230 /* Antarctica/Macquarie */ :table { transPre32:intvector { -1, 2080708096 } trans:intvector { -1680508800, -1665388800, -1601719200, -687052800, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000, 1238860800, 1254585600, 1301760000, 1317484800 } @@ -1094,25 +1100,25 @@ zoneinfo64:table(nofallback) { finalRule { "AT" } finalRaw:int { 36000 } finalYear:int { 2012 } - } //Z#230 + } //Z#231 /* Antarctica/Mawson */ :table { trans:intvector { -501206400, 1255809600 } typeOffsets:intvector { 0, 0, 18000, 0, 21600, 0 } typeMap:bin { "0201" } - } //Z#231 - /* Antarctica/McMurdo */ :int { 555 } //Z#232 + } //Z#232 + /* Antarctica/McMurdo */ :int { 556 } //Z#233 /* Antarctica/Palmer */ :table { trans:intvector { -157766400, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 389070000, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1480820400 } typeOffsets:intvector { 0, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "02010201020102010201030403010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#233 + } //Z#234 /* Antarctica/Rothera */ :table { trans:intvector { 218246400 } typeOffsets:intvector { 0, 0, -10800, 0 } typeMap:bin { "01" } - } //Z#234 - /* Antarctica/South_Pole */ :int { 555 } //Z#235 - /* Antarctica/Syowa */ :int { 311 } //Z#236 + } //Z#235 + /* Antarctica/South_Pole */ :int { 556 } //Z#236 + /* Antarctica/Syowa */ :int { 312 } //Z#237 /* Antarctica/Troll */ :table { trans:intvector { 1111885200, 1130634000 } typeOffsets:intvector { 0, 0, 0, 7200 } @@ -1120,74 +1126,74 @@ zoneinfo64:table(nofallback) { finalRule { "Troll" } finalRaw:int { 0 } finalYear:int { 2006 } - } //Z#237 + } //Z#238 /* Antarctica/Vostok */ :table { trans:intvector { -380073600, 760035600, 783648000, 1702839600 } typeOffsets:intvector { 0, 0, 18000, 0, 25200, 0 } typeMap:bin { "02000201" } - } //Z#238 - /* Arctic/Longyearbyen */ :int { 447 } //Z#239 - /* Asia/Aden */ :int { 311 } //Z#240 + } //Z#239 + /* Arctic/Longyearbyen */ :int { 448 } //Z#240 + /* Asia/Aden */ :int { 312 } //Z#241 /* Asia/Almaty */ :table { trans:intvector { -1441170468, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701812800, 717537600, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1709229600 } typeOffsets:intvector { 18468, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040301" } - } //Z#241 + } //Z#242 /* Asia/Amman */ :table { trans:intvector { -1230776624, 108165600, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 215643600, 231285600, 244501200, 262735200, 275950800, 481154400, 496962000, 512949600, 528670800, 544399200, 560120400, 575848800, 592174800, 610581600, 623624400, 641167200, 655074000, 671839200, 685918800, 702856800, 717973200, 733701600, 749422800, 765151200, 779662800, 797205600, 811116000, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 930780000, 938124000, 954367200, 970178400, 985816800, 1001628000, 1017352800, 1033077600, 1048802400, 1066946400, 1080252000, 1097791200, 1112306400, 1128031200, 1143756000, 1161900000, 1175205600, 1193349600, 1206655200, 1225404000, 1238104800, 1256853600, 1269554400, 1288303200, 1301608800, 1319752800, 1333058400, 1387486800, 1395957600, 1414706400, 1427407200, 1446156000, 1459461600, 1477605600, 1490911200, 1509055200, 1522360800, 1540504800, 1553810400, 1571954400, 1585260000, 1604008800, 1616709600, 1635458400, 1645740000, 1666908000 } typeOffsets:intvector { 8624, 0, 7200, 0, 7200, 3600, 10800, 0 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#242 + } //Z#243 /* Asia/Anadyr */ :table { trans:intvector { -1441194596, -1247572800, 354884400, 370692000, 386420400, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701791200, 717516000, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400, 859644000, 877788000, 891093600, 909237600, 922543200, 941292000, 953992800, 972741600, 985442400, 1004191200, 1017496800, 1035640800, 1048946400, 1067090400, 1080396000, 1099144800, 1111845600, 1130594400, 1143295200, 1162044000, 1174744800, 1193493600, 1206799200, 1224943200, 1238248800, 1256392800, 1269698400, 1288450800, 1301151600 } typeOffsets:intvector { 42596, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600, 46800, 0, 46800, 3600 } typeMap:bin { "03050605040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#243 + } //Z#244 /* Asia/Aqtau */ :table { trans:intvector { -1441164064, -1247544000, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } typeOffsets:intvector { 12064, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "0103050403040304030403040304030403040304030201030403040304010201020102010201020102010201020102010203" } - } //Z#244 + } //Z#245 /* Asia/Aqtobe */ :table { trans:intvector { -1441165720, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000 } typeOffsets:intvector { 13720, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010304050403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403" } - } //Z#245 + } //Z#246 /* Asia/Ashgabat */ :table { trans:intvector { -1441166012, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000 } typeOffsets:intvector { 14012, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103" } - links:intvector { 246, 247 } - } //Z#246 - /* Asia/Ashkhabad */ :int { 246 } //Z#247 + links:intvector { 247, 248 } + } //Z#247 + /* Asia/Ashkhabad */ :int { 247 } //Z#248 /* Asia/Atyrau */ :table { trans:intvector { -1441164464, -1247540400, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } typeOffsets:intvector { 12464, 0, 10800, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "0104060504050405040504050405040504050405040302040504050405040504050405040504030203020302030203020304" } - } //Z#248 + } //Z#249 /* Asia/Baghdad */ :table { transPre32:intvector { -1, 1770435036 } trans:intvector { -1641005856, 389048400, 402264000, 417906000, 433800000, 449614800, 465422400, 481150800, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670464000, 686275200, 702086400, 717897600, 733622400, 749433600, 765158400, 780969600, 796694400, 812505600, 828316800, 844128000, 859852800, 875664000, 891388800, 907200000, 922924800, 938736000, 954547200, 970358400, 986083200, 1001894400, 1017619200, 1033430400, 1049155200, 1064966400, 1080777600, 1096588800, 1112313600, 1128124800, 1143849600, 1159660800, 1175385600, 1191196800 } typeOffsets:intvector { 10660, 0, 10656, 0, 10800, 0, 10800, 3600 } typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - } //Z#249 - /* Asia/Bahrain */ :int { 307 } //Z#250 + } //Z#250 + /* Asia/Bahrain */ :int { 308 } //Z#251 /* Asia/Baku */ :table { trans:intvector { -1441163964, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701823600, 717548400, 828234000, 846378000, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000, 1319932800, 1332633600, 1351382400, 1364688000, 1382832000, 1396137600, 1414281600, 1427587200, 1445731200 } typeOffsets:intvector { 11964, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "010304030403040304030403040304030403040304030201020304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - } //Z#251 + } //Z#252 /* Asia/Bangkok */ :table { trans:intvector { -1570084924 } typeOffsets:intvector { 24124, 0, 25200, 0 } typeMap:bin { "01" } - links:intvector { 252, 304, 333, 520 } - } //Z#252 + links:intvector { 253, 305, 334, 521 } + } //Z#253 /* Asia/Barnaul */ :table { trans:intvector { -1579844100, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 801590400, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1459022400 } typeOffsets:intvector { 20100, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#253 + } //Z#254 /* Asia/Beirut */ :table { transPre32:intvector { -1, 1454817976 } trans:intvector { -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1473645600, -1460948400, -399866400, -386650800, -368330400, -355114800, -336794400, -323578800, -305172000, -291956400, -273636000, -260420400, 78012000, 86734800, 105055200, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 212965200, 231285600, 244501200, 262735200, 275950800, 452210400, 466722000, 483746400, 498258000, 515282400, 529794000, 546818400, 561330000, 581119200, 592952400, 610754400, 624488400, 641512800, 656024400, 673048800, 687560400, 704671200, 718146000, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 906843600, 922572000, 941317200 } @@ -1196,57 +1202,57 @@ zoneinfo64:table(nofallback) { finalRule { "Lebanon" } finalRaw:int { 7200 } finalYear:int { 2000 } - } //Z#254 + } //Z#255 /* Asia/Bishkek */ :table { trans:intvector { -1441169904, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683582400, 703018800, 717530400, 734468400, 748980000, 765918000, 780429600, 797367600, 811879200, 828817200, 843933600, 859671000, 877811400, 891120600, 909261000, 922570200, 941315400, 954019800, 972765000, 985469400, 1004214600, 1017523800, 1035664200, 1048973400, 1067113800, 1080423000, 1099168200, 1111872600, 1123783200 } typeOffsets:intvector { 17904, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020102010201020102010201020102010201020102010201020102010203" } - } //Z#255 - /* Asia/Brunei */ :int { 291 } //Z#256 - /* Asia/Calcutta */ :int { 288 } //Z#257 + } //Z#256 + /* Asia/Brunei */ :int { 292 } //Z#257 + /* Asia/Calcutta */ :int { 289 } //Z#258 /* Asia/Chita */ :table { trans:intvector { -1579419232, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800, 1459015200 } typeOffsets:intvector { 27232, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } typeMap:bin { "010304030403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050103" } - } //Z#258 - /* Asia/Choibalsan */ :int { 329 } //Z#259 - /* Asia/Chongqing */ :int { 316 } //Z#260 - /* Asia/Chungking */ :int { 316 } //Z#261 + } //Z#259 + /* Asia/Choibalsan */ :int { 330 } //Z#260 + /* Asia/Chongqing */ :int { 317 } //Z#261 + /* Asia/Chungking */ :int { 317 } //Z#262 /* Asia/Colombo */ :table { transPre32:intvector { -1, 1454807332 } trans:intvector { -2019705572, -883287000, -862639200, -764051400, 832962600, 846266400, 1145039400 } typeOffsets:intvector { 19164, 0, 19172, 0, 19800, 0, 19800, 1800, 19800, 3600, 21600, 0, 23400, 0 } typeMap:bin { "0102030402060502" } - } //Z#262 - /* Asia/Dacca */ :int { 265 } //Z#263 + } //Z#263 + /* Asia/Dacca */ :int { 266 } //Z#264 /* Asia/Damascus */ :table { trans:intvector { -1577931912, -1568592000, -1554080400, -1537142400, -1522630800, -1505692800, -1491181200, -1474243200, -1459126800, -242265600, -228877200, -210556800, -197427600, -178934400, -165718800, -147398400, -134269200, -116467200, -102646800, -84326400, -71110800, -52704000, -39488400, -21168000, -7952400, 10368000, 23583600, 41904000, 55119600, 73526400, 86742000, 105062400, 118278000, 136598400, 149814000, 168134400, 181350000, 199756800, 212972400, 231292800, 241916400, 262828800, 273452400, 418694400, 433810800, 450316800, 465433200, 508896000, 529196400, 541555200, 562633200, 574387200, 594255600, 607305600, 623199600, 638928000, 654649200, 670456800, 686264400, 702684000, 717886800, 733096800, 748904400, 765151200, 780958800, 796687200, 812494800, 828309600, 844117200, 859759200, 875653200, 891208800, 907189200, 922917600, 938725200, 954540000, 970347600, 986076000, 1001883600, 1017612000, 1033419600, 1049148000, 1064955600, 1080770400, 1096578000, 1112306400, 1128114000, 1143842400, 1158872400, 1175205600, 1193950800, 1207260000, 1225486800, 1238104800, 1256850000, 1270159200, 1288299600, 1301608800, 1319749200, 1333058400, 1351198800, 1364508000, 1382648400, 1395957600, 1414702800, 1427407200, 1446152400, 1458856800, 1477602000, 1490911200, 1509051600, 1522360800, 1540501200, 1553810400, 1571950800, 1585260000, 1604005200, 1616709600, 1635454800, 1648159200, 1666904400 } typeOffsets:intvector { 8712, 0, 7200, 0, 7200, 3600, 10800, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#264 + } //Z#265 /* Asia/Dhaka */ :table { transPre32:intvector { -1, 1770423996 } trans:intvector { -891582800, -872058600, -862637400, -576138600, 1245430800, 1262278800 } typeOffsets:intvector { 21700, 0, 19800, 0, 21200, 0, 21600, 0, 21600, 3600, 23400, 0 } typeMap:bin { "02050105030403" } - links:intvector { 263, 265, 375 } - } //Z#265 + links:intvector { 264, 266, 376 } + } //Z#266 /* Asia/Dili */ :table { trans:intvector { -1830412800, -879152400, 199897200, 969120000 } typeOffsets:intvector { 30140, 0, 28800, 0, 32400, 0 } typeMap:bin { "01020102" } - } //Z#266 + } //Z#267 /* Asia/Dubai */ :table { trans:intvector { -1577936472 } typeOffsets:intvector { 13272, 0, 14400, 0 } typeMap:bin { "01" } - links:intvector { 267, 298, 524, 528 } - } //Z#267 + links:intvector { 268, 299, 525, 529 } + } //Z#268 /* Asia/Dushanbe */ :table { trans:intvector { -1441168512, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 684363600 } typeOffsets:intvector { 16512, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "010304030403040304030403040304030403040304030201" } - } //Z#268 + } //Z#269 /* Asia/Famagusta */ :table { trans:intvector { -1518920148, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396141200, 1414285200, 1427590800, 1445734800, 1459040400, 1473282000, 1509238800, 1521939600, 1540688400 } typeOffsets:intvector { 8148, 0, 7200, 0, 7200, 3600, 10800, 0 } @@ -1254,7 +1260,7 @@ zoneinfo64:table(nofallback) { finalRule { "EUAsia" } finalRaw:int { 7200 } finalYear:int { 2019 } - } //Z#269 + } //Z#270 /* Asia/Gaza */ :table { transPre32:intvector { -1, 2109557424 } trans:intvector { -933638400, -923097600, -919036800, -857347200, -844300800, -825811200, -812678400, -794188800, -779846400, -762652800, -748310400, -731116800, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 334101600, 337730400, 452642400, 462319200, 482277600, 494370000, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1219957200, 1238104800, 1252015200, 1269640860, 1281474000, 1301608860, 1312146000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445551200, 1458946800, 1477692000, 1490396400, 1509141600, 1521846000, 1540591200, 1553810400, 1572037200, 1585346400, 1603490400, 1616796000, 1635458400, 1648332000, 1666998000, 1682726400, 1698447600, 1713571200, 1729897200, 1744416000, 1761346800, 1774656000, 1792796400, 1806105600, 1824850800, 1837555200, 1856300400, 1869004800, 1887750000, 1901059200, 1919199600, 1932508800, 1950649200, 1963958400, 1982703600, 1995408000, 2014153200, 2026857600, 2045602800, 2058307200, 2077052400, 2090361600, 2107897200, 2121811200, 2138742000 } @@ -1264,8 +1270,8 @@ zoneinfo64:table(nofallback) { finalRule { "Palestine" } finalRaw:int { 7200 } finalYear:int { 2088 } - } //Z#270 - /* Asia/Harbin */ :int { 316 } //Z#271 + } //Z#271 + /* Asia/Harbin */ :int { 317 } //Z#272 /* Asia/Hebron */ :table { transPre32:intvector { -1, 2109557273 } trans:intvector { -933638400, -923097600, -919036800, -857347200, -844300800, -825811200, -812678400, -794188800, -779846400, -762652800, -748310400, -731116800, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 334101600, 337730400, 452642400, 462319200, 482277600, 494370000, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1220216400, 1238104800, 1252015200, 1269554400, 1281474000, 1301608860, 1312146000, 1314655200, 1317330000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445551200, 1458946800, 1477692000, 1490396400, 1509141600, 1521846000, 1540591200, 1553810400, 1572037200, 1585346400, 1603490400, 1616796000, 1635458400, 1648332000, 1666998000, 1682726400, 1698447600, 1713571200, 1729897200, 1744416000, 1761346800, 1774656000, 1792796400, 1806105600, 1824850800, 1837555200, 1856300400, 1869004800, 1887750000, 1901059200, 1919199600, 1932508800, 1950649200, 1963958400, 1982703600, 1995408000, 2014153200, 2026857600, 2045602800, 2058307200, 2077052400, 2090361600, 2107897200, 2121811200, 2138742000 } @@ -1275,40 +1281,40 @@ zoneinfo64:table(nofallback) { finalRule { "Palestine" } finalRaw:int { 7200 } finalYear:int { 2088 } - } //Z#272 + } //Z#273 /* Asia/Ho_Chi_Minh */ :table { trans:intvector { -1851577590, -852105600, -782643600, -767869200, -718095600, -457772400, -315648000, 171820800 } typeOffsets:intvector { 25590, 0, 25200, 0, 28800, 0, 32400, 0 } typeMap:bin { "0102030102010201" } - links:intvector { 273, 312, 634 } - } //Z#273 + links:intvector { 274, 313, 635 } + } //Z#274 /* Asia/Hong_Kong */ :table { trans:intvector { -2056690800, -900910800, -891579600, -884248200, -761209200, -747907200, -728541000, -717049800, -697091400, -683785800, -668061000, -654755400, -636611400, -623305800, -605161800, -591856200, -573712200, -559801800, -541657800, -528352200, -510211800, -498112200, -478762200, -466662600, -446707800, -435213000, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132816600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } typeOffsets:intvector { 27402, 0, 28800, 0, 28800, 1800, 28800, 3600, 32400, 0 } typeMap:bin { "010302040103010301030103010301030103010301030103010301030103010301030103010301030103010301030103010301030103010301030103010301030103010301" } - links:intvector { 274, 514 } - } //Z#274 + links:intvector { 275, 515 } + } //Z#275 /* Asia/Hovd */ :table { trans:intvector { -2032927596, 252439200, 417978000, 433785600, 449600400, 465321600, 481050000, 496771200, 512499600, 528220800, 543949200, 559670400, 575398800, 591120000, 606848400, 622569600, 638298000, 654624000, 670352400, 686073600, 701802000, 717523200, 733251600, 748972800, 764701200, 780422400, 796150800, 811872000, 828205200, 843926400, 859654800, 875376000, 891104400, 906825600, 988398000, 1001700000, 1017428400, 1033149600, 1048878000, 1064599200, 1080327600, 1096048800, 1111777200, 1127498400, 1143226800, 1159552800, 1427482800, 1443196800, 1458932400, 1474646400 } typeOffsets:intvector { 21996, 0, 21600, 0, 25200, 0, 25200, 3600 } typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - } //Z#275 + } //Z#276 /* Asia/Irkutsk */ :table { trans:intvector { -1575874625, -1247554800, 354902400, 370710000, 386438400, 402246000, 417974400, 433782000, 449596800, 465328800, 481053600, 496778400, 512503200, 528228000, 543952800, 559677600, 575402400, 591127200, 606852000, 622576800, 638301600, 654631200, 670356000, 686084400, 695761200, 701805600, 717530400, 733255200, 748980000, 764704800, 780429600, 796154400, 811879200, 828208800, 846352800, 859658400, 877802400, 891108000, 909252000, 922557600, 941306400, 954007200, 972756000, 985456800, 1004205600, 1017511200, 1035655200, 1048960800, 1067104800, 1080410400, 1099159200, 1111860000, 1130608800, 1143309600, 1162058400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200, 1256407200, 1269712800, 1288461600, 1301162400, 1414256400 } typeOffsets:intvector { 25025, 0, 25200, 0, 25200, 3600, 28800, 0, 28800, 3600, 32400, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#276 - /* Asia/Istanbul */ :int { 460 } //Z#277 + } //Z#277 + /* Asia/Istanbul */ :int { 461 } //Z#278 /* Asia/Jakarta */ :table { trans:intvector { -1451719200, -1172906400, -876641400, -766054800, -683883000, -620812800, -189415800 } typeOffsets:intvector { 25632, 0, 25200, 0, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } typeMap:bin { "02030503040301" } - } //Z#278 + } //Z#279 /* Asia/Jayapura */ :table { trans:intvector { -1172913768, -799491600, -189423000 } typeOffsets:intvector { 33768, 0, 32400, 0, 34200, 0 } typeMap:bin { "010201" } - } //Z#279 + } //Z#280 /* Asia/Jerusalem */ :table { transPre32:intvector { -1, 1454818042 } trans:intvector { -1641003640, -933638400, -923097600, -919036800, -857347200, -844300800, -825811200, -812678400, -794188800, -779846400, -762652800, -748310400, -731116800, -681955200, -673228800, -667958400, -652320000, -636422400, -622080000, -608947200, -591840000, -572486400, -558576000, -542851200, -527731200, -514425600, -490838400, -482976000, -459388800, -451526400, -428544000, -418262400, -400118400, -387417600, 142380000, 150843600, 167176800, 178664400, 334101600, 337730400, 452642400, 462319200, 482277600, 494370000, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 826840800, 842821200, 858895200, 874184400, 890344800, 905029200, 923011200, 936313200, 955670400, 970783200, 986770800, 1001282400, 1017356400, 1033941600, 1048806000, 1065132000, 1081292400, 1095804000, 1112313600, 1128812400, 1143763200, 1159657200, 1175212800, 1189897200, 1206662400, 1223161200, 1238112000, 1254006000, 1269561600, 1284246000, 1301616000, 1317510000, 1333065600, 1348354800, 1364515200, 1382828400 } @@ -1317,83 +1323,83 @@ zoneinfo64:table(nofallback) { finalRule { "Zion" } finalRaw:int { 7200 } finalYear:int { 2014 } - links:intvector { 280, 323, 530 } - } //Z#280 + links:intvector { 281, 324, 531 } + } //Z#281 /* Asia/Kabul */ :table { transPre32:intvector { -1, 1770429088 } trans:intvector { -788932800 } typeOffsets:intvector { 16608, 0, 14400, 0, 16200, 0 } typeMap:bin { "0102" } - } //Z#281 + } //Z#282 /* Asia/Kamchatka */ :table { trans:intvector { -1487759676, -1247569200, 354888000, 370695600, 386424000, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701791200, 717516000, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400, 859644000, 877788000, 891093600, 909237600, 922543200, 941292000, 953992800, 972741600, 985442400, 1004191200, 1017496800, 1035640800, 1048946400, 1067090400, 1080396000, 1099144800, 1111845600, 1130594400, 1143295200, 1162044000, 1174744800, 1193493600, 1206799200, 1224943200, 1238248800, 1256392800, 1269698400, 1288450800, 1301151600 } typeOffsets:intvector { 38076, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#282 + } //Z#283 /* Asia/Karachi */ :table { trans:intvector { -1988166492, -862637400, -764145000, -576135000, 1018119600, 1033840800, 1212260400, 1225476000, 1239735600, 1257012000 } typeOffsets:intvector { 16092, 0, 18000, 0, 18000, 3600, 19800, 0, 19800, 3600 } typeMap:bin { "03040301020102010201" } - links:intvector { 283, 548 } - } //Z#283 - /* Asia/Kashgar */ :int { 331 } //Z#284 + links:intvector { 284, 549 } + } //Z#284 + /* Asia/Kashgar */ :int { 332 } //Z#285 /* Asia/Kathmandu */ :table { trans:intvector { -1577943676, 504901800 } typeOffsets:intvector { 20476, 0, 19800, 0, 20700, 0 } typeMap:bin { "0102" } - links:intvector { 285, 286 } - } //Z#285 - /* Asia/Katmandu */ :int { 285 } //Z#286 + links:intvector { 286, 287 } + } //Z#286 + /* Asia/Katmandu */ :int { 286 } //Z#287 /* Asia/Khandyga */ :table { trans:intvector { -1579424533, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1072882800, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1315832400, 1414252800 } typeOffsets:intvector { 32533, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403050605060506050605060506050605070503" } - } //Z#287 + } //Z#288 /* Asia/Kolkata */ :table { transPre32:intvector { -1, 649730088, -1, 1139272496 } trans:intvector { -2019705670, -891581400, -872058600, -862637400, -764145000 } typeOffsets:intvector { 21208, 0, 19270, 0, 19800, 0, 19800, 3600, 21200, 0 } typeMap:bin { "04010203020302" } - links:intvector { 257, 288, 516 } - } //Z#288 + links:intvector { 258, 289, 517 } + } //Z#289 /* Asia/Krasnoyarsk */ :table { trans:intvector { -1577513486, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288465200, 1301166000, 1414260000 } typeOffsets:intvector { 22286, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600, 28800, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#289 - /* Asia/Kuala_Lumpur */ :int { 317 } //Z#290 + } //Z#290 + /* Asia/Kuala_Lumpur */ :int { 318 } //Z#291 /* Asia/Kuching */ :table { trans:intvector { -1383463280, -1167636600, -1082448000, -1074586800, -1050825600, -1042964400, -1019289600, -1011428400, -987753600, -979892400, -956217600, -948356400, -924595200, -916734000, -893059200, -885198000, -879667200, -767005200 } typeOffsets:intvector { 26480, 0, 27000, 0, 28800, 0, 28800, 1200, 32400, 0 } typeMap:bin { "010203020302030203020302030203020402" } - links:intvector { 256, 291 } - } //Z#291 - /* Asia/Kuwait */ :int { 311 } //Z#292 - /* Asia/Macao */ :int { 294 } //Z#293 + links:intvector { 257, 292 } + } //Z#292 + /* Asia/Kuwait */ :int { 312 } //Z#293 + /* Asia/Macao */ :int { 295 } //Z#294 /* Asia/Macau */ :table { trans:intvector { -2056692850, -884509200, -873280800, -855918000, -841744800, -828529200, -765363600, -747046800, -733827600, -716461200, -697021200, -683715600, -667990800, -654771600, -636627600, -623322000, -605178000, -591872400, -573642000, -559818000, -541674000, -528368400, -510224400, -498128400, -478774800, -466678800, -446720400, -435229200, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132820200, -117088200, -101370600, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } typeOffsets:intvector { 27250, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600 } typeMap:bin { "0103040304030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 293, 294 } - } //Z#294 + links:intvector { 294, 295 } + } //Z#295 /* Asia/Magadan */ :table { trans:intvector { -1441188192, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600, 1461427200 } typeOffsets:intvector { 36192, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } typeMap:bin { "010304030403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050103" } - } //Z#295 + } //Z#296 /* Asia/Makassar */ :table { trans:intvector { -1172908656, -880272000, -766054800 } typeOffsets:intvector { 28656, 0, 28800, 0, 32400, 0 } typeMap:bin { "010201" } - links:intvector { 296, 328 } - } //Z#296 + links:intvector { 297, 329 } + } //Z#297 /* Asia/Manila */ :table { transPre32:intvector { -1, 350346264, -1, 2075884096 } trans:intvector { -1046678400, -1040115600, -885024000, -880016400, -783594000, -760093200, -496224000, -491562000, 228326400, 243702000, 643219200, 649177200 } typeOffsets:intvector { -57368, 0, 28800, 0, 28800, 3600, 29032, 0, 32400, 0 } typeMap:bin { "0301020102040201020102010201" } - } //Z#297 - /* Asia/Muscat */ :int { 267 } //Z#298 + } //Z#298 + /* Asia/Muscat */ :int { 268 } //Z#299 /* Asia/Nicosia */ :table { trans:intvector { -1518920008, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 909277200, 922582800, 941331600 } typeOffsets:intvector { 8008, 0, 7200, 0, 7200, 3600 } @@ -1401,187 +1407,187 @@ zoneinfo64:table(nofallback) { finalRule { "EUAsia" } finalRaw:int { 7200 } finalYear:int { 2000 } - links:intvector { 299, 476 } - } //Z#299 + links:intvector { 300, 477 } + } //Z#300 /* Asia/Novokuznetsk */ :table { trans:intvector { -1441259328, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288468800, 1301169600 } typeOffsets:intvector { 20928, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#300 + } //Z#301 /* Asia/Novosibirsk */ :table { trans:intvector { -1579476700, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 738086400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1469304000 } typeOffsets:intvector { 19900, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#301 + } //Z#302 /* Asia/Omsk */ :table { trans:intvector { -1582088010, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701812800, 717537600, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600 } typeOffsets:intvector { 17610, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600, 25200, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#302 + } //Z#303 /* Asia/Oral */ :table { trans:intvector { -1441164324, -1247540400, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622591200, 638316000, 654645600, 670370400, 686095200, 695772000, 701816400, 717544800, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } typeOffsets:intvector { 12324, 0, 10800, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010405060504050405040504050405040504030203020302040302030203020302030203020302030203020302030203020304" } - } //Z#303 - /* Asia/Phnom_Penh */ :int { 252 } //Z#304 + } //Z#304 + /* Asia/Phnom_Penh */ :int { 253 } //Z#305 /* Asia/Pontianak */ :table { trans:intvector { -1172906240, -881220600, -766054800, -683883000, -620812800, -189415800, 567964800 } typeOffsets:intvector { 26240, 0, 25200, 0, 27000, 0, 28800, 0, 32400, 0 } typeMap:bin { "02040203020301" } - } //Z#305 + } //Z#306 /* Asia/Pyongyang */ :table { trans:intvector { -1948782180, -1830414600, 1439564400, 1525446000 } typeOffsets:intvector { 30180, 0, 30600, 0, 32400, 0 } typeMap:bin { "01020102" } - } //Z#306 + } //Z#307 /* Asia/Qatar */ :table { trans:intvector { -1577935568, 76190400 } typeOffsets:intvector { 12368, 0, 10800, 0, 14400, 0 } typeMap:bin { "0201" } - links:intvector { 250, 307 } - } //Z#307 + links:intvector { 251, 308 } + } //Z#308 /* Asia/Qostanay */ :table { trans:intvector { -1441167268, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1709229600 } typeOffsets:intvector { 15268, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "01030405040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040503" } - } //Z#308 + } //Z#309 /* Asia/Qyzylorda */ :table { trans:intvector { -1441167712, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695768400, 701812800, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1545328800 } typeOffsets:intvector { 15712, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "01030405040304030403040304030403040304030403020305040304030403040304030403040304030403040304030403040503" } - } //Z#309 - /* Asia/Rangoon */ :int { 336 } //Z#310 + } //Z#310 + /* Asia/Rangoon */ :int { 337 } //Z#311 /* Asia/Riyadh */ :table { trans:intvector { -719636812 } typeOffsets:intvector { 11212, 0, 10800, 0 } typeMap:bin { "01" } - links:intvector { 236, 240, 292, 311 } - } //Z#311 - /* Asia/Saigon */ :int { 273 } //Z#312 + links:intvector { 237, 241, 293, 312 } + } //Z#312 + /* Asia/Saigon */ :int { 274 } //Z#313 /* Asia/Sakhalin */ :table { trans:intvector { -2031039048, -768560400, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200, 1459008000 } typeOffsets:intvector { 34248, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600 } typeMap:bin { "010405040504050405040504050405040504050405040302040504050405040504050403020302030203020302030203020302030203020302030203020302040204" } - } //Z#313 + } //Z#314 /* Asia/Samarkand */ :table { trans:intvector { -1441168073, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686091600 } typeOffsets:intvector { 16073, 0, 14400, 0, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010203040302030203020302030203020302030203020302" } - } //Z#314 + } //Z#315 /* Asia/Seoul */ :table { trans:intvector { -1948782472, -1830414600, -681210000, -672228000, -654771600, -640864800, -623408400, -609415200, -588848400, -577965600, -498128400, -462702600, -451733400, -429784200, -418296600, -399544200, -387451800, -368094600, -356002200, -336645000, -324552600, -305195400, -293103000, -264933000, 547578000, 560883600, 579027600, 592333200 } typeOffsets:intvector { 30472, 0, 30600, 0, 30600, 3600, 32400, 0, 32400, 3600 } typeMap:bin { "01030403040304030403010201020102010201020102010304030403" } - links:intvector { 315, 601 } - } //Z#315 + links:intvector { 316, 602 } + } //Z#316 /* Asia/Shanghai */ :table { transPre32:intvector { -1, 2117485353 } trans:intvector { -1600675200, -1585904400, -933667200, -922093200, -908870400, -888829200, -881049600, -767869200, -745833600, -733827600, -716889600, -699613200, -683884800, -670669200, -652348800, -650019600, 515527200, 527014800, 545162400, 558464400, 577216800, 589914000, 608666400, 621968400, 640116000, 653418000, 671565600, 684867600 } typeOffsets:intvector { 29143, 0, 28800, 0, 28800, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } - links:intvector { 260, 261, 271, 316, 385, 550 } - } //Z#316 + links:intvector { 261, 262, 272, 317, 386, 551 } + } //Z#317 /* Asia/Singapore */ :table { trans:intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378662400 } typeOffsets:intvector { 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } typeMap:bin { "01020304060405" } - links:intvector { 290, 317, 603 } - } //Z#317 + links:intvector { 291, 318, 604 } + } //Z#318 /* Asia/Srednekolymsk */ :table { trans:intvector { -1441188892, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600 } typeOffsets:intvector { 36892, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#318 + } //Z#319 /* Asia/Taipei */ :table { transPre32:intvector { -1, 1959718936 } trans:intvector { -1017820800, -766224000, -745833600, -733827600, -716889600, -699613200, -683884800, -670669200, -652348800, -639133200, -620812800, -607597200, -589276800, -576061200, -562924800, -541760400, -528710400, -510224400, -497174400, -478688400, -465638400, -449830800, -434016000, -418208400, -402480000, -386672400, -370944000, -355136400, -339408000, -323600400, -302515200, -291978000, -270979200, -260442000, 133977600, 149785200, 165513600, 181321200, 299606400, 307551600 } typeOffsets:intvector { 29160, 0, 28800, 0, 28800, 3600, 32400, 0 } typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 319, 600 } - } //Z#319 + links:intvector { 320, 601 } + } //Z#320 /* Asia/Tashkent */ :table { trans:intvector { -1441168631, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600 } typeOffsets:intvector { 16631, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "010304030403040304030403040304030403040304030201" } - } //Z#320 + } //Z#321 /* Asia/Tbilisi */ :table { trans:intvector { -1441162751, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701816400, 717537600, 733266000, 748987200, 764715600, 780436800, 796161600, 811882800, 828216000, 877806000, 891115200, 909255600, 922564800, 941310000, 954014400, 972759600, 985464000, 1004209200, 1017518400, 1035658800, 1048968000, 1067108400, 1080417600, 1088276400, 1099177200, 1111878000 } typeOffsets:intvector { 10751, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "0103040304030403040304030403040304030403040302010201020102030403040304030403040304030403040304020103" } - } //Z#321 + } //Z#322 /* Asia/Tehran */ :table { - trans:intvector { -1090466744, 227820600, 246223800, 259617600, 271108800, 283982400, 296598600, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600 } + trans:intvector { -1090466744, 227820600, 246223800, 259617600, 271108800, 279576000, 296598600, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600 } typeOffsets:intvector { 12344, 0, 12600, 0, 12600, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01020304030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 322, 529 } - } //Z#322 - /* Asia/Tel_Aviv */ :int { 280 } //Z#323 - /* Asia/Thimbu */ :int { 325 } //Z#324 + links:intvector { 323, 530 } + } //Z#323 + /* Asia/Tel_Aviv */ :int { 281 } //Z#324 + /* Asia/Thimbu */ :int { 326 } //Z#325 /* Asia/Thimphu */ :table { trans:intvector { -706341516, 560025000 } typeOffsets:intvector { 21516, 0, 19800, 0, 21600, 0 } typeMap:bin { "0102" } - links:intvector { 324, 325 } - } //Z#325 + links:intvector { 325, 326 } + } //Z#326 /* Asia/Tokyo */ :table { transPre32:intvector { -1, 1707254896 } trans:intvector { -683802000, -672310800, -654771600, -640861200, -620298000, -609411600, -588848400, -577962000 } typeOffsets:intvector { 33539, 0, 32400, 0, 32400, 3600 } typeMap:bin { "010201020102010201" } - links:intvector { 326, 531, 533 } - } //Z#326 + links:intvector { 327, 532, 534 } + } //Z#327 /* Asia/Tomsk */ :table { trans:intvector { -1578807591, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1020193200, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1464465600 } typeOffsets:intvector { 20391, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304020102010201020102010201020102010201030103" } - } //Z#327 - /* Asia/Ujung_Pandang */ :int { 296 } //Z#328 + } //Z#328 + /* Asia/Ujung_Pandang */ :int { 297 } //Z#329 /* Asia/Ulaanbaatar */ :table { trans:intvector { -2032931252, 252435600, 417974400, 433782000, 449596800, 465318000, 481046400, 496767600, 512496000, 528217200, 543945600, 559666800, 575395200, 591116400, 606844800, 622566000, 638294400, 654620400, 670348800, 686070000, 701798400, 717519600, 733248000, 748969200, 764697600, 780418800, 796147200, 811868400, 828201600, 843922800, 859651200, 875372400, 891100800, 906822000, 988394400, 1001696400, 1017424800, 1033146000, 1048874400, 1064595600, 1080324000, 1096045200, 1111773600, 1127494800, 1143223200, 1159549200, 1427479200, 1443193200, 1458928800, 1474642800 } typeOffsets:intvector { 25652, 0, 25200, 0, 28800, 0, 28800, 3600 } typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - links:intvector { 259, 329, 330 } - } //Z#329 - /* Asia/Ulan_Bator */ :int { 329 } //Z#330 + links:intvector { 260, 330, 331 } + } //Z#330 + /* Asia/Ulan_Bator */ :int { 330 } //Z#331 /* Asia/Urumqi */ :table { trans:intvector { -1325483420 } typeOffsets:intvector { 21020, 0, 21600, 0 } typeMap:bin { "01" } - links:intvector { 284, 331 } - } //Z#331 + links:intvector { 285, 332 } + } //Z#332 /* Asia/Ust-Nera */ :table { trans:intvector { -1579426374, -1247558400, 354898800, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1315828800, 1414249200 } typeOffsets:intvector { 34374, 0, 28800, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } typeMap:bin { "010206050605060506050605060506050605060506050403050605060506050605060506050605060506050605060506050605060506050605060506050605070503" } - } //Z#332 - /* Asia/Vientiane */ :int { 252 } //Z#333 + } //Z#333 + /* Asia/Vientiane */ :int { 253 } //Z#334 /* Asia/Vladivostok */ :table { trans:intvector { -1487321251, -1247562000, 354895200, 370702800, 386431200, 402238800, 417967200, 433774800, 449589600, 465321600, 481046400, 496771200, 512496000, 528220800, 543945600, 559670400, 575395200, 591120000, 606844800, 622569600, 638294400, 654624000, 670348800, 686077200, 695754000, 701798400, 717523200, 733248000, 748972800, 764697600, 780422400, 796147200, 811872000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200 } typeOffsets:intvector { 31651, 0, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#334 + } //Z#335 /* Asia/Yakutsk */ :table { trans:intvector { -1579423138, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800 } typeOffsets:intvector { 31138, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#335 + } //Z#336 /* Asia/Yangon */ :table { trans:intvector { -1577946287, -873268200, -778410000 } typeOffsets:intvector { 23087, 0, 23400, 0, 32400, 0 } typeMap:bin { "010201" } - links:intvector { 310, 336, 521 } - } //Z#336 + links:intvector { 311, 337, 522 } + } //Z#337 /* Asia/Yekaterinburg */ :table { trans:intvector { -1688270553, -1592610305, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1111870800, 1130619600, 1143320400, 1162069200, 1174770000, 1193518800, 1206824400, 1224968400, 1238274000, 1256418000, 1269723600, 1288472400, 1301173200, 1414267200 } typeOffsets:intvector { 14553, 0, 13505, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010204050405040504050405040504050405040504050403020405040504050405040504050405040504050405040504050405040504050405040504050405040604" } - } //Z#337 + } //Z#338 /* Asia/Yerevan */ :table { trans:intvector { -1441162680, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288476000, 1301176800, 1319925600 } typeOffsets:intvector { 10680, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "0103040304030403040304030403040304030403040302010201020102010203040304030403040304030403040304030403040304030403040304030403" } - links:intvector { 338, 543 } - } //Z#338 + links:intvector { 339, 544 } + } //Z#339 /* Atlantic/Azores */ :table { transPre32:intvector { -1, 1581063056 } trans:intvector { -1830376800, -1689548400, -1677794400, -1667426400, -1647730800, -1635890400, -1616194800, -1604354400, -1584658800, -1572732000, -1553036400, -1541196000, -1521500400, -1442444400, -1427670000, -1379286000, -1364770800, -1348441200, -1333321200, -1316386800, -1301266800, -1284332400, -1269817200, -1221433200, -1206918000, -1191193200, -1175468400, -1127689200, -1111964400, -1096844400, -1080514800, -1063580400, -1049065200, -1033340400, -1017615600, -1002495600, -986166000, -969231600, -950482800, -942015600, -922489200, -906937200, -891126000, -877302000, -873676800, -864000000, -857948400, -845852400, -842832000, -831340800, -825894000, -814402800, -810777600, -799891200, -794444400, -782953200, -779328000, -768441600, -762994800, -749084400, -733359600, -717624000, -701899200, -686174400, -670449600, -654724800, -639000000, -623275200, -607550400, -591825600, -575496000, -559771200, -544046400, -528321600, -512596800, -496872000, -481147200, -465422400, -449697600, -433972800, -417643200, -401918400, -386193600, -370468800, -354744000, -339019200, -323294400, -307569600, -291844800, -276120000, -260395200, -244670400, -228340800, -212616000, -196891200, -181166400, -165441600, -149716800, -133992000, -118267200, -102542400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 725421600, 733280400, 740278800, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1590,7 +1596,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { -3600 } finalYear:int { 1997 } - } //Z#339 + } //Z#340 /* Atlantic/Bermuda */ :table { trans:intvector { -1664307642, -1648932042, -1632080442, -1618692042, -1262281242, -882727200, -858538800, -845229600, -825879600, -814384800, -793825200, -782935200, -762375600, -713988000, -703710000, -681933600, -672865200, -650484000, -641415600, -618429600, -609966000, -586980000, -578516400, -555530400, -546462000, -429127200, -415825200, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -15558, 0, -15558, 3600, -14400, 0, -14400, 3600 } @@ -1598,7 +1604,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#340 + } //Z#341 /* Atlantic/Canary */ :table { trans:intvector { -1509663504, -733874400, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -3696, 0, -3600, 0, 0, 0, 0, 3600 } @@ -1606,13 +1612,13 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - } //Z#341 + } //Z#342 /* Atlantic/Cape_Verde */ :table { trans:intvector { -1830376800, -862610400, -764118000, 186120000 } typeOffsets:intvector { -5644, 0, -7200, 0, -7200, 3600, -3600, 0 } typeMap:bin { "01020103" } - } //Z#342 - /* Atlantic/Faeroe */ :int { 344 } //Z#343 + } //Z#343 + /* Atlantic/Faeroe */ :int { 345 } //Z#344 /* Atlantic/Faroe */ :table { trans:intvector { -1955748776, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -1624, 0, 0, 0, 0, 3600 } @@ -1620,9 +1626,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 343, 344 } - } //Z#344 - /* Atlantic/Jan_Mayen */ :int { 447 } //Z#345 + links:intvector { 344, 345 } + } //Z#345 + /* Atlantic/Jan_Mayen */ :int { 448 } //Z#346 /* Atlantic/Madeira */ :table { trans:intvector { -1830380400, -1689552000, -1677798000, -1667430000, -1647734400, -1635894000, -1616198400, -1604358000, -1584662400, -1572735600, -1553040000, -1541199600, -1521504000, -1442448000, -1427673600, -1379289600, -1364774400, -1348444800, -1333324800, -1316390400, -1301270400, -1284336000, -1269820800, -1221436800, -1206921600, -1191196800, -1175472000, -1127692800, -1111968000, -1096848000, -1080518400, -1063584000, -1049068800, -1033344000, -1017619200, -1002499200, -986169600, -969235200, -950486400, -942019200, -922492800, -906940800, -891129600, -877305600, -873680400, -864003600, -857952000, -845856000, -842835600, -831344400, -825897600, -814406400, -810781200, -799894800, -794448000, -782956800, -779331600, -768445200, -762998400, -749088000, -733363200, -717627600, -701902800, -686178000, -670453200, -654728400, -639003600, -623278800, -607554000, -591829200, -575499600, -559774800, -544050000, -528325200, -512600400, -496875600, -481150800, -465426000, -449701200, -433976400, -417646800, -401922000, -386197200, -370472400, -354747600, -339022800, -323298000, -307573200, -291848400, -276123600, -260398800, -244674000, -228344400, -212619600, -196894800, -181170000, -165445200, -149720400, -133995600, -118270800, -102546000, 386726400, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -4056, 0, -3600, 0, -3600, 3600, -3600, 7200, 0, 0, 0, 3600 } @@ -1630,20 +1636,20 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - } //Z#346 - /* Atlantic/Reykjavik */ :int { 5 } //Z#347 + } //Z#347 + /* Atlantic/Reykjavik */ :int { 5 } //Z#348 /* Atlantic/South_Georgia */ :table { transPre32:intvector { -1, 1770454464 } typeOffsets:intvector { -8768, 0, -7200, 0 } typeMap:bin { "01" } - } //Z#348 - /* Atlantic/St_Helena */ :int { 5 } //Z#349 + } //Z#349 + /* Atlantic/St_Helena */ :int { 5 } //Z#350 /* Atlantic/Stanley */ :table { trans:intvector { -1824235716, -1018209600, -1003093200, -986760000, -971643600, -954705600, -939589200, -923256000, -908139600, -891806400, -876690000, -860356800, -852066000, 420609600, 433306800, 452052000, 464151600, 483501600, 495601200, 514350000, 527054400, 545799600, 558504000, 577249200, 589953600, 608698800, 621403200, 640753200, 652852800, 672202800, 684907200, 703652400, 716356800, 735102000, 747806400, 766551600, 779256000, 798001200, 810705600, 830055600, 842760000, 861505200, 874209600, 892954800, 905659200, 924404400, 937108800, 955854000, 968558400, 987310800, 999410400, 1019365200, 1030860000, 1050814800, 1062914400, 1082264400, 1094364000, 1113714000, 1125813600, 1145163600, 1157263200, 1176613200, 1188712800, 1208667600, 1220767200, 1240117200, 1252216800, 1271566800, 1283666400 } typeOffsets:intvector { -13884, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010304030403020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#350 - /* Australia/ACT */ :int { 369 } //Z#351 + } //Z#351 + /* Australia/ACT */ :int { 370 } //Z#352 /* Australia/Adelaide */ :table { transPre32:intvector { -1, 1930857236, -1, 2064778096 } trans:intvector { -1672558200, -1665387000, -883639800, -876123000, -860398200, -844673400, -828343800, -813223800, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 384280200, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 637691400, 657045000, 667931400, 688494600, 701195400, 719944200, 731435400, 751998600, 764094600, 783448200, 796149000, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } @@ -1652,15 +1658,15 @@ zoneinfo64:table(nofallback) { finalRule { "AS" } finalRaw:int { 34200 } finalYear:int { 2009 } - links:intvector { 352, 368 } - } //Z#352 + links:intvector { 353, 369 } + } //Z#353 /* Australia/Brisbane */ :table { transPre32:intvector { -1, 1928175368 } trans:intvector { -1672560000, -1665388800, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200 } typeOffsets:intvector { 36728, 0, 36000, 0, 36000, 3600 } typeMap:bin { "0102010201020102010201020102010201" } - links:intvector { 353, 367 } - } //Z#353 + links:intvector { 354, 368 } + } //Z#354 /* Australia/Broken_Hill */ :table { transPre32:intvector { -1, 1930856548, -1, 1980016096, -1, 2064778096 } trans:intvector { -1672558200, -1665387000, -883639800, -876123000, -860398200, -844673400, -828343800, -813223800, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 386699400, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 636481800, 657045000, 667931400, 688494600, 699381000, 719944200, 731435400, 751998600, 762885000, 783448200, 794334600, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } @@ -1669,23 +1675,23 @@ zoneinfo64:table(nofallback) { finalRule { "AS" } finalRaw:int { 34200 } finalYear:int { 2009 } - links:intvector { 354, 373 } - } //Z#354 - /* Australia/Canberra */ :int { 369 } //Z#355 - /* Australia/Currie */ :int { 359 } //Z#356 + links:intvector { 355, 374 } + } //Z#355 + /* Australia/Canberra */ :int { 370 } //Z#356 + /* Australia/Currie */ :int { 360 } //Z#357 /* Australia/Darwin */ :table { transPre32:intvector { -1, 1930859096, -1, 2064778096 } trans:intvector { -1672558200, -1665387000, -883639800, -876123000, -860398200, -844673400, -828343800, -813223800 } typeOffsets:intvector { 31400, 0, 32400, 0, 34200, 0, 34200, 3600 } typeMap:bin { "01020302030203020302" } - links:intvector { 0, 357, 365 } - } //Z#357 + links:intvector { 0, 358, 366 } + } //Z#358 /* Australia/Eucla */ :table { transPre32:intvector { -1, 1957038768 } trans:intvector { -1672555500, -1665384300, -883637100, -876120300, -860395500, -844670700, 152039700, 162926100, 436295700, 447182100, 690311700, 699383700, 1165079700, 1174756500, 1193505300, 1206810900, 1224954900, 1238260500 } typeOffsets:intvector { 30928, 0, 31500, 0, 31500, 3600 } typeMap:bin { "01020102010201020102010201020102010201" } - } //Z#358 + } //Z#359 /* Australia/Hobart */ :table { transPre32:intvector { -1, 1949171940 } trans:intvector { -1680508800, -1665388800, -1646640000, -1635753600, -1615190400, -1604304000, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 } @@ -1694,15 +1700,15 @@ zoneinfo64:table(nofallback) { finalRule { "AT" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 356, 359, 370 } - } //Z#359 - /* Australia/LHI */ :int { 362 } //Z#360 + links:intvector { 357, 360, 371 } + } //Z#360 + /* Australia/LHI */ :int { 363 } //Z#361 /* Australia/Lindeman */ :table { transPre32:intvector { -1, 1928176340 } trans:intvector { -1672560000, -1665388800, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200 } typeOffsets:intvector { 35756, 0, 36000, 0, 36000, 3600 } typeMap:bin { "010201020102010201020102010201020102010201" } - } //Z#361 + } //Z#362 /* Australia/Lord_Howe */ :table { transPre32:intvector { -1, 1930852316 } trans:intvector { 352216800, 372785400, 384273000, 404839800, 415722600, 436289400, 447172200, 467739000, 478621800, 499188600, 511282800, 530033400, 542732400, 562087800, 574786800, 594142200, 606236400, 625591800, 636476400, 657041400, 667926000, 688491000, 699375600, 719940600, 731430000, 751995000, 762879600, 783444600, 794329200, 814894200, 828198000, 846343800, 859647600, 877793400, 891097200, 909243000, 922546800, 941297400, 953996400, 967303800, 985446000, 1004196600, 1017500400, 1035646200, 1048950000, 1067095800, 1080399600, 1099150200, 1111849200, 1130599800, 1143903600, 1162049400, 1174748400, 1193499000, 1207407600, 1223134200 } @@ -1711,8 +1717,8 @@ zoneinfo64:table(nofallback) { finalRule { "LH" } finalRaw:int { 37800 } finalYear:int { 2009 } - links:intvector { 360, 362 } - } //Z#362 + links:intvector { 361, 363 } + } //Z#363 /* Australia/Melbourne */ :table { transPre32:intvector { -1, 1930855704 } trans:intvector { -1672560000, -1665388800, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 384278400, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 561484800, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 796147200, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } @@ -1721,19 +1727,19 @@ zoneinfo64:table(nofallback) { finalRule { "AV" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 363, 371 } - } //Z#363 - /* Australia/NSW */ :int { 369 } //Z#364 - /* Australia/North */ :int { 357 } //Z#365 + links:intvector { 364, 372 } + } //Z#364 + /* Australia/NSW */ :int { 370 } //Z#365 + /* Australia/North */ :int { 358 } //Z#366 /* Australia/Perth */ :table { transPre32:intvector { -1, 1957041892 } trans:intvector { -1672552800, -1665381600, -883634400, -876117600, -860392800, -844668000, 152042400, 162928800, 436298400, 447184800, 690314400, 699386400, 1165082400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200 } typeOffsets:intvector { 27804, 0, 28800, 0, 28800, 3600 } typeMap:bin { "01020102010201020102010201020102010201" } - links:intvector { 366, 372 } - } //Z#366 - /* Australia/Queensland */ :int { 353 } //Z#367 - /* Australia/South */ :int { 352 } //Z#368 + links:intvector { 367, 373 } + } //Z#367 + /* Australia/Queensland */ :int { 354 } //Z#368 + /* Australia/South */ :int { 353 } //Z#369 /* Australia/Sydney */ :table { transPre32:intvector { -1, 1930854204 } trans:intvector { -1672560000, -1665388800, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386697600, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 794332800, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } @@ -1742,140 +1748,140 @@ zoneinfo64:table(nofallback) { finalRule { "AN" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 1, 351, 355, 364, 369 } - } //Z#369 - /* Australia/Tasmania */ :int { 359 } //Z#370 - /* Australia/Victoria */ :int { 363 } //Z#371 - /* Australia/West */ :int { 366 } //Z#372 - /* Australia/Yancowinna */ :int { 354 } //Z#373 - /* BET */ :int { 204 } //Z#374 - /* BST */ :int { 265 } //Z#375 - /* Brazil/Acre */ :int { 198 } //Z#376 - /* Brazil/DeNoronha */ :int { 177 } //Z#377 - /* Brazil/East */ :int { 204 } //Z#378 - /* Brazil/West */ :int { 157 } //Z#379 - /* CAT */ :int { 43 } //Z#380 - /* CET */ :int { 449 } //Z#381 - /* CNT */ :int { 209 } //Z#382 - /* CST */ :int { 98 } //Z#383 - /* CST6CDT */ :int { 98 } //Z#384 - /* CTT */ :int { 316 } //Z#385 - /* Canada/Atlantic */ :int { 129 } //Z#386 - /* Canada/Central */ :int { 224 } //Z#387 - /* Canada/East-Saskatchewan */ :int { 196 } //Z#388 - /* Canada/Eastern */ :int { 219 } //Z#389 - /* Canada/Mountain */ :int { 113 } //Z#390 - /* Canada/Newfoundland */ :int { 209 } //Z#391 - /* Canada/Pacific */ :int { 221 } //Z#392 - /* Canada/Saskatchewan */ :int { 196 } //Z#393 - /* Canada/Yukon */ :int { 223 } //Z#394 - /* Chile/Continental */ :int { 202 } //Z#395 - /* Chile/EasterIsland */ :int { 559 } //Z#396 - /* Cuba */ :int { 130 } //Z#397 - /* EAT */ :int { 48 } //Z#398 - /* ECT */ :int { 478 } //Z#399 - /* EET */ :int { 444 } //Z#400 - /* EST */ :int { 183 } //Z#401 - /* EST5EDT */ :int { 174 } //Z#402 - /* Egypt */ :int { 18 } //Z#403 - /* Eire */ :int { 455 } //Z#404 + links:intvector { 1, 352, 356, 365, 370 } + } //Z#370 + /* Australia/Tasmania */ :int { 360 } //Z#371 + /* Australia/Victoria */ :int { 364 } //Z#372 + /* Australia/West */ :int { 367 } //Z#373 + /* Australia/Yancowinna */ :int { 355 } //Z#374 + /* BET */ :int { 205 } //Z#375 + /* BST */ :int { 266 } //Z#376 + /* Brazil/Acre */ :int { 199 } //Z#377 + /* Brazil/DeNoronha */ :int { 178 } //Z#378 + /* Brazil/East */ :int { 205 } //Z#379 + /* Brazil/West */ :int { 158 } //Z#380 + /* CAT */ :int { 43 } //Z#381 + /* CET */ :int { 450 } //Z#382 + /* CNT */ :int { 210 } //Z#383 + /* CST */ :int { 98 } //Z#384 + /* CST6CDT */ :int { 98 } //Z#385 + /* CTT */ :int { 317 } //Z#386 + /* Canada/Atlantic */ :int { 130 } //Z#387 + /* Canada/Central */ :int { 225 } //Z#388 + /* Canada/East-Saskatchewan */ :int { 197 } //Z#389 + /* Canada/Eastern */ :int { 220 } //Z#390 + /* Canada/Mountain */ :int { 114 } //Z#391 + /* Canada/Newfoundland */ :int { 210 } //Z#392 + /* Canada/Pacific */ :int { 222 } //Z#393 + /* Canada/Saskatchewan */ :int { 197 } //Z#394 + /* Canada/Yukon */ :int { 224 } //Z#395 + /* Chile/Continental */ :int { 203 } //Z#396 + /* Chile/EasterIsland */ :int { 560 } //Z#397 + /* Cuba */ :int { 131 } //Z#398 + /* EAT */ :int { 48 } //Z#399 + /* ECT */ :int { 479 } //Z#400 + /* EET */ :int { 445 } //Z#401 + /* EST */ :int { 184 } //Z#402 + /* EST5EDT */ :int { 175 } //Z#403 + /* Egypt */ :int { 18 } //Z#404 + /* Eire */ :int { 456 } //Z#405 /* Etc/GMT */ :table { typeOffsets:intvector { 0, 0 } - links:intvector { 405, 406, 419, 434, 435, 508, 509, 510, 511, 512 } - } //Z#405 - /* Etc/GMT+0 */ :int { 405 } //Z#406 + links:intvector { 406, 407, 420, 435, 436, 509, 510, 511, 512, 513 } + } //Z#406 + /* Etc/GMT+0 */ :int { 406 } //Z#407 /* Etc/GMT+1 */ :table { typeOffsets:intvector { -3600, 0 } - } //Z#407 + } //Z#408 /* Etc/GMT+10 */ :table { typeOffsets:intvector { -36000, 0 } - } //Z#408 + } //Z#409 /* Etc/GMT+11 */ :table { typeOffsets:intvector { -39600, 0 } - } //Z#409 + } //Z#410 /* Etc/GMT+12 */ :table { typeOffsets:intvector { -43200, 0 } - } //Z#410 + } //Z#411 /* Etc/GMT+2 */ :table { typeOffsets:intvector { -7200, 0 } - } //Z#411 + } //Z#412 /* Etc/GMT+3 */ :table { typeOffsets:intvector { -10800, 0 } - } //Z#412 + } //Z#413 /* Etc/GMT+4 */ :table { typeOffsets:intvector { -14400, 0 } - } //Z#413 + } //Z#414 /* Etc/GMT+5 */ :table { typeOffsets:intvector { -18000, 0 } - } //Z#414 + } //Z#415 /* Etc/GMT+6 */ :table { typeOffsets:intvector { -21600, 0 } - } //Z#415 + } //Z#416 /* Etc/GMT+7 */ :table { typeOffsets:intvector { -25200, 0 } - } //Z#416 + } //Z#417 /* Etc/GMT+8 */ :table { typeOffsets:intvector { -28800, 0 } - } //Z#417 + } //Z#418 /* Etc/GMT+9 */ :table { typeOffsets:intvector { -32400, 0 } - } //Z#418 - /* Etc/GMT-0 */ :int { 405 } //Z#419 + } //Z#419 + /* Etc/GMT-0 */ :int { 406 } //Z#420 /* Etc/GMT-1 */ :table { typeOffsets:intvector { 3600, 0 } - } //Z#420 + } //Z#421 /* Etc/GMT-10 */ :table { typeOffsets:intvector { 36000, 0 } - } //Z#421 + } //Z#422 /* Etc/GMT-11 */ :table { typeOffsets:intvector { 39600, 0 } - } //Z#422 + } //Z#423 /* Etc/GMT-12 */ :table { typeOffsets:intvector { 43200, 0 } - } //Z#423 + } //Z#424 /* Etc/GMT-13 */ :table { typeOffsets:intvector { 46800, 0 } - } //Z#424 + } //Z#425 /* Etc/GMT-14 */ :table { typeOffsets:intvector { 50400, 0 } - } //Z#425 + } //Z#426 /* Etc/GMT-2 */ :table { typeOffsets:intvector { 7200, 0 } - } //Z#426 + } //Z#427 /* Etc/GMT-3 */ :table { typeOffsets:intvector { 10800, 0 } - } //Z#427 + } //Z#428 /* Etc/GMT-4 */ :table { typeOffsets:intvector { 14400, 0 } - } //Z#428 + } //Z#429 /* Etc/GMT-5 */ :table { typeOffsets:intvector { 18000, 0 } - } //Z#429 + } //Z#430 /* Etc/GMT-6 */ :table { typeOffsets:intvector { 21600, 0 } - } //Z#430 + } //Z#431 /* Etc/GMT-7 */ :table { typeOffsets:intvector { 25200, 0 } - } //Z#431 + } //Z#432 /* Etc/GMT-8 */ :table { typeOffsets:intvector { 28800, 0 } - } //Z#432 + } //Z#433 /* Etc/GMT-9 */ :table { typeOffsets:intvector { 32400, 0 } - } //Z#433 - /* Etc/GMT0 */ :int { 405 } //Z#434 - /* Etc/Greenwich */ :int { 405 } //Z#435 - /* Etc/UCT */ :int { 437 } //Z#436 + } //Z#434 + /* Etc/GMT0 */ :int { 406 } //Z#435 + /* Etc/Greenwich */ :int { 406 } //Z#436 + /* Etc/UCT */ :int { 438 } //Z#437 /* Etc/UTC */ :table { typeOffsets:intvector { 0, 0 } - links:intvector { 436, 437, 438, 440, 618, 632, 633, 637 } - } //Z#437 - /* Etc/Universal */ :int { 437 } //Z#438 + links:intvector { 437, 438, 439, 441, 619, 633, 634, 638 } + } //Z#438 + /* Etc/Universal */ :int { 438 } //Z#439 /* Etc/Unknown */ :table { typeOffsets:intvector { 0, 0 } - } //Z#439 - /* Etc/Zulu */ :int { 437 } //Z#440 - /* Europe/Amsterdam */ :int { 449 } //Z#441 + } //Z#440 + /* Etc/Zulu */ :int { 438 } //Z#441 + /* Europe/Amsterdam */ :int { 450 } //Z#442 /* Europe/Andorra */ :table { transPre32:intvector { -1, 2117514132 } trans:intvector { -733881600, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1884,12 +1890,12 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#442 + } //Z#443 /* Europe/Astrakhan */ :table { trans:intvector { -1441249932, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1459033200 } typeOffsets:intvector { 11532, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01030403040304030403040304030403040302010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#443 + } //Z#444 /* Europe/Athens */ :table { trans:intvector { -1686101632, -1182996000, -1178161200, -906861600, -904878000, -857257200, -844477200, -828237600, -812422800, -552362400, -541652400, 166485600, 186184800, 198028800, 213753600, 228873600, 244080000, 260323200, 275446800, 291798000, 307407600, 323388000, 338936400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5692, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } @@ -1897,9 +1903,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - links:intvector { 400, 444 } - } //Z#444 - /* Europe/Belfast */ :int { 468 } //Z#445 + links:intvector { 401, 445 } + } //Z#445 + /* Europe/Belfast */ :int { 469 } //Z#446 /* Europe/Belgrade */ :table { transPre32:intvector { -1, 1581051976 } trans:intvector { -905824800, -857257200, -844556400, -828226800, -812502000, -796777200, -777942000, -766623600, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1908,8 +1914,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 446, 467, 479, 485, 488, 502 } - } //Z#446 + links:intvector { 447, 468, 480, 486, 489, 503 } + } //Z#447 /* Europe/Berlin */ :table { transPre32:intvector { -1, 1872912888 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -776563200, -765936000, -761180400, -748479600, -733273200, -717631200, -714610800, -710380800, -701910000, -684975600, -670460400, -654130800, -639010800, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1918,9 +1924,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 239, 345, 447, 454, 477, 490 } - } //Z#447 - /* Europe/Bratislava */ :int { 480 } //Z#448 + links:intvector { 240, 346, 448, 455, 478, 491 } + } //Z#448 + /* Europe/Bratislava */ :int { 481 } //Z#449 /* Europe/Brussels */ :table { transPre32:intvector { -1, 1843972096 } trans:intvector { -1740355200, -1693702800, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1613826000, -1604278800, -1585530000, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1473642000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -934668000, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766623600, -745455600, -733273200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1929,8 +1935,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 381, 441, 449, 469, 536 } - } //Z#449 + links:intvector { 382, 442, 450, 470, 537 } + } //Z#450 /* Europe/Bucharest */ :table { trans:intvector { -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, 296604000, 307486800, 323816400, 338940000, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686095200, 701820000, 717544800, 733269600, 748994400, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } typeOffsets:intvector { 6264, 0, 7200, 0, 7200, 3600 } @@ -1938,7 +1944,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1998 } - } //Z#450 + } //Z#451 /* Europe/Budapest */ :table { transPre32:intvector { -1, 1796706716 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600470000, -1587250800, -1569711600, -1555196400, -906775200, -857257200, -844556400, -828226800, -812502000, -796777200, -778471200, -762656400, -749689200, -733276800, -717634800, -701910000, -686185200, -670460400, -654130800, -639010800, -492656400, -481168800, -461199600, -449708400, -428540400, -418258800, -397090800, -386809200, 323823600, 338943600, 354668400, 370393200, 386118000, 401842800, 417567600, 433292400, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1947,8 +1953,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#451 - /* Europe/Busingen */ :int { 504 } //Z#452 + } //Z#452 + /* Europe/Busingen */ :int { 505 } //Z#453 /* Europe/Chisinau */ :table { transPre32:intvector { -1, 1454819576 } trans:intvector { -1637114100, -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, -927165600, -898138800, -857257200, -844556400, -828226800, -812502000, -800157600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 641944800, 654652800, 670377600, 686102400, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859680000, 877824000 } @@ -1957,9 +1963,9 @@ zoneinfo64:table(nofallback) { finalRule { "Moldova" } finalRaw:int { 7200 } finalYear:int { 1998 } - links:intvector { 453, 493 } - } //Z#453 - /* Europe/Copenhagen */ :int { 447 } //Z#454 + links:intvector { 454, 494 } + } //Z#454 + /* Europe/Copenhagen */ :int { 448 } //Z#455 /* Europe/Dublin */ :table { trans:intvector { -1691962479, -1680471279, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -733356000, -719445600, -699487200, -684972000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } typeOffsets:intvector { -1521, 0, -1521, 3600, 0, 0, 0, 3600, 3600, 0 } @@ -1967,8 +1973,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 404, 455 } - } //Z#455 + links:intvector { 405, 456 } + } //Z#456 /* Europe/Gibraltar */ :table { transPre32:intvector { -1, 1473317380 } trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1977,8 +1983,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#456 - /* Europe/Guernsey */ :int { 468 } //Z#457 + } //Z#457 + /* Europe/Guernsey */ :int { 469 } //Z#458 /* Europe/Helsinki */ :table { trans:intvector { -1535938789, -875671200, -859773600, 354672000, 370396800, 386121600, 401846400, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5989, 0, 7200, 0, 7200, 3600 } @@ -1986,29 +1992,29 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - links:intvector { 458, 472 } - } //Z#458 - /* Europe/Isle_of_Man */ :int { 468 } //Z#459 + links:intvector { 459, 473 } + } //Z#459 + /* Europe/Isle_of_Man */ :int { 469 } //Z#460 /* Europe/Istanbul */ :table { transPre32:intvector { -1, 1454819544 } trans:intvector { -1869875816, -1693706400, -1680490800, -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1440208800, -1428030000, -1409709600, -1396494000, -931053600, -922676400, -917834400, -892436400, -875844000, -764737200, -744343200, -733806000, -716436000, -701924400, -684986400, -670474800, -654141600, -639025200, -622087200, -606970800, -590032800, -575521200, -235620000, -194842800, -177732000, -165726000, 107910000, 121215600, 133920000, 152665200, 164678400, 184114800, 196214400, 215564400, 228873600, 245804400, 260323200, 267915600, 428454000, 433893600, 468111600, 482799600, 496710000, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686098800, 701823600, 717548400, 733273200, 748998000, 764118000, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301274000, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396227600, 1414285200, 1427590800, 1446944400, 1459040400, 1473195600 } typeOffsets:intvector { 6952, 0, 7016, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030405040203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020304" } - links:intvector { 277, 460, 617 } - } //Z#460 - /* Europe/Jersey */ :int { 468 } //Z#461 + links:intvector { 278, 461, 618 } + } //Z#461 + /* Europe/Jersey */ :int { 469 } //Z#462 /* Europe/Kaliningrad */ :table { transPre32:intvector { -1, 1872911176 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780372000, -778730400, -762663600, -749095200, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000, 1414278000 } typeOffsets:intvector { 4920, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "0102010201020102010201020102030403050605060506050605060506050605060504030403040304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#462 - /* Europe/Kiev */ :int { 465 } //Z#463 + } //Z#463 + /* Europe/Kiev */ :int { 466 } //Z#464 /* Europe/Kirov */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } typeOffsets:intvector { 11928, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "010304030403040304030403040304030403020102010302010201020102010201020102010201020102010201020102010201020102010201020102010301" } - } //Z#464 + } //Z#465 /* Europe/Kyiv */ :table { trans:intvector { -1441159324, -1247536800, -892522800, -857257200, -844556400, -828226800, -825382800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 646783200, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846378000, 859683600, 877827600 } typeOffsets:intvector { 7324, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2016,8 +2022,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1998 } - links:intvector { 463, 465, 495, 503 } - } //Z#465 + links:intvector { 464, 466, 496, 504 } + } //Z#466 /* Europe/Lisbon */ :table { trans:intvector { -1830384000, -1689555600, -1677801600, -1667433600, -1647738000, -1635897600, -1616202000, -1604361600, -1584666000, -1572739200, -1553043600, -1541203200, -1521507600, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1221440400, -1206925200, -1191200400, -1175475600, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942022800, -922496400, -906944400, -891133200, -877309200, -873684000, -864007200, -857955600, -845859600, -842839200, -831348000, -825901200, -814410000, -810784800, -799898400, -794451600, -782960400, -779335200, -768448800, -763002000, -749091600, -733366800, -717631200, -701906400, -686181600, -670456800, -654732000, -639007200, -623282400, -607557600, -591832800, -575503200, -559778400, -544053600, -528328800, -512604000, -496879200, -481154400, -465429600, -449704800, -433980000, -417650400, -401925600, -386200800, -370476000, -354751200, -339026400, -323301600, -307576800, -291852000, -276127200, -260402400, -244677600, -228348000, -212623200, -196898400, -181173600, -165448800, -149724000, -133999200, -118274400, -102549600, 212544000, 228268800, 243993600, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -2205, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } @@ -2025,9 +2031,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 466, 599, 636 } - } //Z#466 - /* Europe/Ljubljana */ :int { 446 } //Z#467 + links:intvector { 467, 600, 637 } + } //Z#467 + /* Europe/Ljubljana */ :int { 447 } //Z#468 /* Europe/London */ :table { transPre32:intvector { -1, 442304971 } trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } @@ -2036,9 +2042,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 445, 457, 459, 461, 468, 506, 507 } - } //Z#468 - /* Europe/Luxembourg */ :int { 449 } //Z#469 + links:intvector { 446, 458, 460, 462, 469, 507, 508 } + } //Z#469 + /* Europe/Luxembourg */ :int { 450 } //Z#470 /* Europe/Madrid */ :table { transPre32:intvector { -1, 2117514496 } trans:intvector { -1631926800, -1616889600, -1601168400, -1585353600, -1442451600, -1427673600, -1379293200, -1364774400, -1348448400, -1333324800, -1316390400, -1301270400, -1284339600, -1269820800, -1026954000, -1017619200, -1001898000, -999482400, -986090400, -954115200, -940208400, -873079200, -862621200, -842839200, -828320400, -811389600, -796870800, -779940000, -765421200, -748490400, -733971600, -652327200, -639018000, 135122400, 150246000, 166572000, 181695600, 196812000, 212540400, 228866400, 243990000, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2047,7 +2053,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#470 + } //Z#471 /* Europe/Malta */ :table { transPre32:intvector { -1, 1891488612 } trans:intvector { -1690765200, -1680487200, -1664758800, -1648951200, -1635123600, -1616896800, -1604278800, -1585533600, -1571014800, -1555293600, -932432400, -857257200, -844556400, -828226800, -812588400, -798073200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71715600, -50547600, -40266000, -18493200, -8211600, 12956400, 23238000, 43801200, 54687600, 75855600, 86742000, 102380400, 118105200, 135730800, 148518000, 167187600, 180489600, 198637200, 211939200, 230086800, 243388800, 261536400, 274838400, 292986000, 306288000, 323312400, 338342400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2056,23 +2062,23 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#471 - /* Europe/Mariehamn */ :int { 458 } //Z#472 + } //Z#472 + /* Europe/Mariehamn */ :int { 459 } //Z#473 /* Europe/Minsk */ :table { transPre32:intvector { -1, 1454819880 } trans:intvector { -1441158600, -1247536800, -899780400, -857257200, -844556400, -828226800, -812502000, -804650400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 670374000, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000 } typeOffsets:intvector { 6616, 0, 3600, 0, 3600, 3600, 6600, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "0304060201020102060706070607060706070607060706070607060504050405040504050405040504050405040504050405040504050405040504050405040504050406" } - } //Z#473 - /* Europe/Monaco */ :int { 478 } //Z#474 + } //Z#474 + /* Europe/Monaco */ :int { 479 } //Z#475 /* Europe/Moscow */ :table { trans:intvector { -1688265017, -1656819079, -1641353479, -1627965079, -1618716679, -1596429079, -1593820800, -1589860800, -1542427200, -1539493200, -1525323600, -1522728000, -1491188400, -1247536800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } typeOffsets:intvector { 9017, 0, 7200, 0, 7200, 3600, 9079, 0, 9079, 3600, 9079, 7200, 10800, 0, 10800, 3600, 10800, 7200, 14400, 0 } typeMap:bin { "0304030504050706070807060106070607060706070607060706070607060706070602010607060706070607060706070607060706070607060706070607060706070607060706070607060906" } - links:intvector { 475, 635 } - } //Z#475 - /* Europe/Nicosia */ :int { 299 } //Z#476 - /* Europe/Oslo */ :int { 447 } //Z#477 + links:intvector { 476, 636 } + } //Z#476 + /* Europe/Nicosia */ :int { 300 } //Z#477 + /* Europe/Oslo */ :int { 448 } //Z#478 /* Europe/Paris */ :table { trans:intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -932436000, -857257200, -844556400, -828226800, -812502000, -800071200, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 561, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } @@ -2080,9 +2086,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 399, 474, 478 } - } //Z#478 - /* Europe/Podgorica */ :int { 446 } //Z#479 + links:intvector { 400, 475, 479 } + } //Z#479 + /* Europe/Podgorica */ :int { 447 } //Z#480 /* Europe/Prague */ :table { transPre32:intvector { -1, 1825565432 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -765327600, -746578800, -733359600, -728517600, -721260000, -716425200, -701910000, -684975600, -670460400, -654217200, -639010800, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2091,8 +2097,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 448, 480 } - } //Z#480 + links:intvector { 449, 481 } + } //Z#481 /* Europe/Riga */ :table { trans:intvector { -1632008194, -1618702594, -1601681794, -1597275394, -1377308194, -928029600, -899521200, -857257200, -844556400, -828226800, -812502000, -796777200, -795834000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 843955200, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 985482000, 1004230800 } typeOffsets:intvector { 5794, 0, 3600, 0, 3600, 3600, 5794, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2100,7 +2106,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2002 } - } //Z#481 + } //Z#482 /* Europe/Rome */ :table { transPre32:intvector { -1, 1891402096 } trans:intvector { -1690765200, -1680487200, -1664758800, -1648951200, -1635123600, -1616896800, -1604278800, -1585533600, -1571014800, -1555293600, -932432400, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71715600, -50547600, -40266000, -18493200, -8211600, 12956400, 23238000, 43801200, 54687600, 75855600, 86742000, 107910000, 118191600, 138754800, 149641200, 170809200, 181090800, 202258800, 212540400, 233103600, 243990000, 265158000, 276044400, 296607600, 307494000, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2109,27 +2115,27 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 482, 484, 497 } - } //Z#482 + links:intvector { 483, 485, 498 } + } //Z#483 /* Europe/Samara */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 687916800, 701820000, 717544800, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288479600, 1301180400 } typeOffsets:intvector { 12020, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "02040504050405040504050405040504050403020302010204050405040504050405040504050405040504050405040504050405040504050405040504030204" } - } //Z#483 - /* Europe/San_Marino */ :int { 482 } //Z#484 - /* Europe/Sarajevo */ :int { 446 } //Z#485 + } //Z#484 + /* Europe/San_Marino */ :int { 483 } //Z#485 + /* Europe/Sarajevo */ :int { 447 } //Z#486 /* Europe/Saratov */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1480806000 } typeOffsets:intvector { 11058, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01030403040304030403040304030403020102010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#486 + } //Z#487 /* Europe/Simferopol */ :table { transPre32:intvector { -1, 1454818312 } trans:intvector { -1441160160, -1247536800, -888894000, -857257200, -844556400, -828226800, -812502000, -811648800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 646786800, 701827200, 717552000, 733276800, 749001600, 764726400, 767739600, 780447600, 796172400, 811897200, 828219600, 846374400, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396137600, 1414274400 } typeOffsets:intvector { 8184, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8160, 0, 10800, 0, 10800, 3600, 14400, 0 } typeMap:bin { "050306020102010206070607060706070607060706070607060706030403040304070607060706040304030403040304030403040304030403040304030403040304030403040304030806" } - } //Z#487 - /* Europe/Skopje */ :int { 446 } //Z#488 + } //Z#488 + /* Europe/Skopje */ :int { 447 } //Z#489 /* Europe/Sofia */ :table { transPre32:intvector { -1, 1454820900, -1, 1925440280 } trans:intvector { -857257200, -844556400, -828226800, -812502000, -796777200, -781048800, 291762000, 307576800, 323816400, 339026400, 355266000, 370393200, 386715600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } @@ -2138,8 +2144,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1998 } - } //Z#489 - /* Europe/Stockholm */ :int { 447 } //Z#490 + } //Z#490 + /* Europe/Stockholm */ :int { 448 } //Z#491 /* Europe/Tallinn */ :table { trans:intvector { -1638322740, -1632006000, -1618700400, -1593824400, -1535938740, -927943200, -892954800, -857257200, -844556400, -828226800, -812502000, -797652000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909277200, 922582800, 941331600, 1017536400, 1035680400 } typeOffsets:intvector { 5940, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2147,7 +2153,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2003 } - } //Z#491 + } //Z#492 /* Europe/Tirane */ :table { trans:intvector { -1767230360, -932346000, -857257200, -844556400, -843519600, 136854000, 149896800, 168130800, 181432800, 199839600, 213141600, 231894000, 244591200, 263257200, 276040800, 294706800, 307490400, 326156400, 339458400, 357087600, 370389600, 389142000, 402444000, 419468400, 433807200, 449622000, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 4760, 0, 3600, 0, 3600, 3600 } @@ -2155,16 +2161,16 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#492 - /* Europe/Tiraspol */ :int { 453 } //Z#493 + } //Z#493 + /* Europe/Tiraspol */ :int { 454 } //Z#494 /* Europe/Ulyanovsk */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1459033200 } typeOffsets:intvector { 11616, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "030506050605060506050605060506050605040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050305" } - } //Z#494 - /* Europe/Uzhgorod */ :int { 465 } //Z#495 - /* Europe/Vaduz */ :int { 504 } //Z#496 - /* Europe/Vatican */ :int { 482 } //Z#497 + } //Z#495 + /* Europe/Uzhgorod */ :int { 466 } //Z#496 + /* Europe/Vaduz */ :int { 505 } //Z#497 + /* Europe/Vatican */ :int { 483 } //Z#498 /* Europe/Vienna */ :table { transPre32:intvector { -1, 1872912175 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1569711600, -1555801200, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780188400, -748479600, -733273200, -717634800, -701910000, -684975600, -670460400, 323823600, 338940000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2173,7 +2179,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#498 + } //Z#499 /* Europe/Vilnius */ :table { transPre32:intvector { -1, 1454820420 } trans:intvector { -1672536240, -1585100136, -1561251600, -1553565600, -928198800, -900126000, -857257200, -844556400, -828226800, -812502000, -802144800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891133200, 909277200, 922582800, 941331600, 1048986000, 1067130000 } @@ -2182,12 +2188,12 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2004 } - } //Z#499 + } //Z#500 /* Europe/Volgograd */ :table { trans:intvector { -1577761060, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1540681200, 1609020000 } typeOffsets:intvector { 10660, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "0103040304030403040304030403040302010201020103020102010201020102010201020102010201020102010201020102010201020102010201020103010301" } - } //Z#500 + } //Z#501 /* Europe/Warsaw */ :table { trans:intvector { -1717032240, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600473600, -1587168000, -1501725600, -931734000, -857257200, -844556400, -828226800, -812502000, -796608000, -778726800, -762660000, -748486800, -733273200, -715215600, -701910000, -684975600, -670460400, -654130800, -639010800, -397094400, -386812800, -371088000, -355363200, -334195200, -323308800, -307584000, -291859200, -271296000, -260409600, -239846400, -228960000, -208396800, -197510400, -176342400, -166060800, 228873600, 243993600, 260323200, 276048000, 291772800, 307497600, 323827200, 338947200, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5040, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } @@ -2195,10 +2201,10 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 501, 598 } - } //Z#501 - /* Europe/Zagreb */ :int { 446 } //Z#502 - /* Europe/Zaporozhye */ :int { 465 } //Z#503 + links:intvector { 502, 599 } + } //Z#502 + /* Europe/Zagreb */ :int { 447 } //Z#503 + /* Europe/Zaporozhye */ :int { 466 } //Z#504 /* Europe/Zurich */ :table { transPre32:intvector { -1, 619768448, -1, 1909720710 } trans:intvector { -904435200, -891129600, -872985600, -859680000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2207,79 +2213,79 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 452, 496, 504 } - } //Z#504 + links:intvector { 453, 497, 505 } + } //Z#505 /* Factory */ :table { typeOffsets:intvector { 0, 0 } - } //Z#505 - /* GB */ :int { 468 } //Z#506 - /* GB-Eire */ :int { 468 } //Z#507 - /* GMT */ :int { 405 } //Z#508 - /* GMT+0 */ :int { 405 } //Z#509 - /* GMT-0 */ :int { 405 } //Z#510 - /* GMT0 */ :int { 405 } //Z#511 - /* Greenwich */ :int { 405 } //Z#512 - /* HST */ :int { 569 } //Z#513 - /* Hongkong */ :int { 274 } //Z#514 - /* IET */ :int { 132 } //Z#515 - /* IST */ :int { 288 } //Z#516 - /* Iceland */ :int { 5 } //Z#517 - /* Indian/Antananarivo */ :int { 48 } //Z#518 + } //Z#506 + /* GB */ :int { 469 } //Z#507 + /* GB-Eire */ :int { 469 } //Z#508 + /* GMT */ :int { 406 } //Z#509 + /* GMT+0 */ :int { 406 } //Z#510 + /* GMT-0 */ :int { 406 } //Z#511 + /* GMT0 */ :int { 406 } //Z#512 + /* Greenwich */ :int { 406 } //Z#513 + /* HST */ :int { 570 } //Z#514 + /* Hongkong */ :int { 275 } //Z#515 + /* IET */ :int { 133 } //Z#516 + /* IST */ :int { 289 } //Z#517 + /* Iceland */ :int { 5 } //Z#518 + /* Indian/Antananarivo */ :int { 48 } //Z#519 /* Indian/Chagos */ :table { trans:intvector { -1988167780, 820436400 } typeOffsets:intvector { 17380, 0, 18000, 0, 21600, 0 } typeMap:bin { "0102" } - } //Z#519 - /* Indian/Christmas */ :int { 252 } //Z#520 - /* Indian/Cocos */ :int { 336 } //Z#521 - /* Indian/Comoro */ :int { 48 } //Z#522 - /* Indian/Kerguelen */ :int { 525 } //Z#523 - /* Indian/Mahe */ :int { 267 } //Z#524 + } //Z#520 + /* Indian/Christmas */ :int { 253 } //Z#521 + /* Indian/Cocos */ :int { 337 } //Z#522 + /* Indian/Comoro */ :int { 48 } //Z#523 + /* Indian/Kerguelen */ :int { 526 } //Z#524 + /* Indian/Mahe */ :int { 268 } //Z#525 /* Indian/Maldives */ :table { trans:intvector { -315636840 } typeOffsets:intvector { 17640, 0, 18000, 0 } typeMap:bin { "01" } - links:intvector { 523, 525 } - } //Z#525 + links:intvector { 524, 526 } + } //Z#526 /* Indian/Mauritius */ :table { trans:intvector { -1988164200, 403041600, 417034800, 1224972000, 1238274000 } typeOffsets:intvector { 13800, 0, 14400, 0, 14400, 3600 } typeMap:bin { "0102010201" } - } //Z#526 - /* Indian/Mayotte */ :int { 48 } //Z#527 - /* Indian/Reunion */ :int { 267 } //Z#528 - /* Iran */ :int { 322 } //Z#529 - /* Israel */ :int { 280 } //Z#530 - /* JST */ :int { 326 } //Z#531 - /* Jamaica */ :int { 143 } //Z#532 - /* Japan */ :int { 326 } //Z#533 - /* Kwajalein */ :int { 574 } //Z#534 - /* Libya */ :int { 56 } //Z#535 - /* MET */ :int { 449 } //Z#536 - /* MIT */ :int { 554 } //Z#537 - /* MST */ :int { 186 } //Z#538 - /* MST7MDT */ :int { 110 } //Z#539 - /* Mexico/BajaNorte */ :int { 218 } //Z#540 - /* Mexico/BajaSur */ :int { 161 } //Z#541 - /* Mexico/General */ :int { 166 } //Z#542 - /* NET */ :int { 338 } //Z#543 - /* NST */ :int { 555 } //Z#544 - /* NZ */ :int { 555 } //Z#545 - /* NZ-CHAT */ :int { 557 } //Z#546 - /* Navajo */ :int { 110 } //Z#547 - /* PLT */ :int { 283 } //Z#548 - /* PNT */ :int { 186 } //Z#549 - /* PRC */ :int { 316 } //Z#550 - /* PRT */ :int { 191 } //Z#551 - /* PST */ :int { 152 } //Z#552 - /* PST8PDT */ :int { 152 } //Z#553 + } //Z#527 + /* Indian/Mayotte */ :int { 48 } //Z#528 + /* Indian/Reunion */ :int { 268 } //Z#529 + /* Iran */ :int { 323 } //Z#530 + /* Israel */ :int { 281 } //Z#531 + /* JST */ :int { 327 } //Z#532 + /* Jamaica */ :int { 144 } //Z#533 + /* Japan */ :int { 327 } //Z#534 + /* Kwajalein */ :int { 575 } //Z#535 + /* Libya */ :int { 56 } //Z#536 + /* MET */ :int { 450 } //Z#537 + /* MIT */ :int { 555 } //Z#538 + /* MST */ :int { 187 } //Z#539 + /* MST7MDT */ :int { 111 } //Z#540 + /* Mexico/BajaNorte */ :int { 219 } //Z#541 + /* Mexico/BajaSur */ :int { 162 } //Z#542 + /* Mexico/General */ :int { 167 } //Z#543 + /* NET */ :int { 339 } //Z#544 + /* NST */ :int { 556 } //Z#545 + /* NZ */ :int { 556 } //Z#546 + /* NZ-CHAT */ :int { 558 } //Z#547 + /* Navajo */ :int { 111 } //Z#548 + /* PLT */ :int { 284 } //Z#549 + /* PNT */ :int { 187 } //Z#550 + /* PRC */ :int { 317 } //Z#551 + /* PRT */ :int { 192 } //Z#552 + /* PST */ :int { 153 } //Z#553 + /* PST8PDT */ :int { 153 } //Z#554 /* Pacific/Apia */ :table { transPre32:intvector { -1, 1849542912 } trans:intvector { -1861878784, -631110600, 1285498800, 1301752800, 1316872800, 1325239200, 1333202400, 1348927200, 1365256800, 1380376800, 1396706400, 1411826400, 1428156000, 1443276000, 1459605600, 1474725600, 1491055200, 1506175200, 1522504800, 1538229600, 1554559200, 1569679200, 1586008800, 1601128800, 1617458400 } typeOffsets:intvector { 45184, 0, -41400, 0, -41216, 0, -39600, 0, -39600, 3600, 46800, 0, 46800, 3600 } typeMap:bin { "0201030403040605060506050605060506050605060506050605" } - links:intvector { 537, 554 } - } //Z#554 + links:intvector { 538, 555 } + } //Z#555 /* Pacific/Auckland */ :table { transPre32:intvector { -1, 1102531752 } trans:intvector { -1330335000, -1320057000, -1300699800, -1287396000, -1269250200, -1255946400, -1237800600, -1224496800, -1206351000, -1192442400, -1174901400, -1160992800, -1143451800, -1125914400, -1112607000, -1094464800, -1081157400, -1063015200, -1049707800, -1031565600, -1018258200, -1000116000, -986808600, -968061600, -955359000, -936612000, -923304600, -757425600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } @@ -2288,14 +2294,14 @@ zoneinfo64:table(nofallback) { finalRule { "NZ" } finalRaw:int { 43200 } finalYear:int { 2009 } - links:intvector { 232, 235, 544, 545, 555 } - } //Z#555 + links:intvector { 233, 236, 545, 546, 556 } + } //Z#556 /* Pacific/Bougainville */ :table { transPre32:intvector { -1, 1454789160, -1, 1928176784 } trans:intvector { -868010400, -768906000, 1419696000 } typeOffsets:intvector { 37336, 0, 32400, 0, 35312, 0, 36000, 0, 39600, 0 } typeMap:bin { "0203010304" } - } //Z#556 + } //Z#557 /* Pacific/Chatham */ :table { transPre32:intvector { -1, 1102529668 } trans:intvector { -757426500, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } @@ -2304,9 +2310,9 @@ zoneinfo64:table(nofallback) { finalRule { "Chatham" } finalRaw:int { 45900 } finalYear:int { 2009 } - links:intvector { 546, 557 } - } //Z#557 - /* Pacific/Chuuk */ :int { 587 } //Z#558 + links:intvector { 547, 558 } + } //Z#558 + /* Pacific/Chuuk */ :int { 588 } //Z#559 /* Pacific/Easter */ :table { trans:intvector { -1178124152, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1494730800, 1502596800, 1526180400, 1534046400, 1554606000, 1567915200, 1586055600, 1599364800, 1617505200, 1630814400, 1648954800, 1662868800, 1680404400, 1693713600 } typeOffsets:intvector { -26248, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } @@ -2314,99 +2320,99 @@ zoneinfo64:table(nofallback) { finalRule { "Chile" } finalRaw:int { -21600 } finalYear:int { 2024 } - links:intvector { 396, 559 } - } //Z#559 + links:intvector { 397, 560 } + } //Z#560 /* Pacific/Efate */ :table { trans:intvector { -1829387596, 125409600, 133876800, 433256400, 448977600, 464706000, 480427200, 496760400, 511876800, 528210000, 543931200, 559659600, 575380800, 591109200, 606830400, 622558800, 638280000, 654008400, 669729600, 686062800, 696340800, 719931600, 727790400 } typeOffsets:intvector { 40396, 0, 39600, 0, 39600, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201" } - } //Z#560 - /* Pacific/Enderbury */ :int { 571 } //Z#561 + } //Z#561 + /* Pacific/Enderbury */ :int { 572 } //Z#562 /* Pacific/Fakaofo */ :table { transPre32:intvector { -1, 2117555592 } trans:intvector { 1325242800 } typeOffsets:intvector { -41096, 0, -39600, 0, 46800, 0 } typeMap:bin { "0102" } - } //Z#562 + } //Z#563 /* Pacific/Fiji */ :table { trans:intvector { -1709985344, 909842400, 920124000, 941896800, 951573600, 1259416800, 1269698400, 1287842400, 1299333600, 1319292000, 1327154400, 1350741600, 1358604000, 1382796000, 1390050000, 1414850400, 1421503200, 1446300000, 1452952800, 1478354400, 1484402400, 1509804000, 1515852000, 1541253600, 1547301600, 1573308000, 1578751200, 1608386400, 1610805600 } typeOffsets:intvector { 42944, 0, 43200, 0, 43200, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } - } //Z#563 - /* Pacific/Funafuti */ :int { 592 } //Z#564 + } //Z#564 + /* Pacific/Funafuti */ :int { 593 } //Z#565 /* Pacific/Galapagos */ :table { trans:intvector { -1230746496, 504939600, 722930400, 728888400 } typeOffsets:intvector { -21504, 0, -21600, 0, -21600, 3600, -18000, 0 } typeMap:bin { "03010201" } - } //Z#565 + } //Z#566 /* Pacific/Gambier */ :table { trans:intvector { -1806678012 } typeOffsets:intvector { -32388, 0, -32400, 0 } typeMap:bin { "01" } - } //Z#566 + } //Z#567 /* Pacific/Guadalcanal */ :table { trans:intvector { -1806748788 } typeOffsets:intvector { 38388, 0, 39600, 0 } typeMap:bin { "01" } - links:intvector { 567, 585, 586, 602 } - } //Z#567 + links:intvector { 568, 586, 587, 603 } + } //Z#568 /* Pacific/Guam */ :table { transPre32:intvector { -1, 350340556, -1, 2117479756 } trans:intvector { -885549600, -802256400, -331891200, -281610000, -73728000, -29415540, -16704000, -10659600, 9907200, 21394800, 41356800, 52844400, 124819200, 130863600, 201888000, 209487660, 230659200, 241542000 } typeOffsets:intvector { -51660, 0, 32400, 0, 34740, 0, 36000, 0, 36000, 3600 } typeMap:bin { "0203010304030403040304030403040304030403" } - links:intvector { 568, 589 } - } //Z#568 + links:intvector { 569, 590 } + } //Z#569 /* Pacific/Honolulu */ :table { transPre32:intvector { -1, 1960865982 } trans:intvector { -1157283000, -1155436200, -880198200, -765376200, -712150200 } typeOffsets:intvector { -37886, 0, -37800, 0, -37800, 3600, -36000, 0 } typeMap:bin { "010201020103" } - links:intvector { 513, 569, 570, 625 } - } //Z#569 - /* Pacific/Johnston */ :int { 569 } //Z#570 + links:intvector { 514, 570, 571, 626 } + } //Z#570 + /* Pacific/Johnston */ :int { 570 } //Z#571 /* Pacific/Kanton */ :table { trans:intvector { -1020470400, 307627200, 788871600 } typeOffsets:intvector { 0, 0, -43200, 0, -39600, 0, 46800, 0 } typeMap:bin { "010203" } - links:intvector { 561, 571 } - } //Z#571 + links:intvector { 562, 572 } + } //Z#572 /* Pacific/Kiritimati */ :table { transPre32:intvector { -1, 2117552256 } trans:intvector { 307622400, 788868000 } typeOffsets:intvector { -37760, 0, -38400, 0, -36000, 0, 50400, 0 } typeMap:bin { "010203" } - } //Z#572 + } //Z#573 /* Pacific/Kosrae */ :table { transPre32:intvector { -1, 350336180, -1, 2117475380 } trans:intvector { -1743678000, -1606813200, -1041418800, -907408800, -770634000, -7988400, 915105600 } typeOffsets:intvector { -47284, 0, 32400, 0, 36000, 0, 39116, 0, 39600, 0, 43200, 0 } typeMap:bin { "030401040201040504" } - } //Z#573 + } //Z#574 /* Pacific/Kwajalein */ :table { transPre32:intvector { -1, 2117474336 } trans:intvector { -1041418800, -907408800, -817462800, -7988400, 745934400 } typeOffsets:intvector { 40160, 0, -43200, 0, 32400, 0, 36000, 0, 39600, 0, 43200, 0 } typeMap:bin { "040302040105" } - links:intvector { 534, 574 } - } //Z#574 - /* Pacific/Majuro */ :int { 592 } //Z#575 + links:intvector { 535, 575 } + } //Z#575 + /* Pacific/Majuro */ :int { 593 } //Z#576 /* Pacific/Marquesas */ :table { trans:intvector { -1806676920 } typeOffsets:intvector { -33480, 0, -34200, 0 } typeMap:bin { "01" } - } //Z#576 - /* Pacific/Midway */ :int { 582 } //Z#577 + } //Z#577 + /* Pacific/Midway */ :int { 583 } //Z#578 /* Pacific/Nauru */ :table { trans:intvector { -1545131260, -862918200, -767350800, 287418600 } typeOffsets:intvector { 40060, 0, 32400, 0, 41400, 0, 43200, 0 } typeMap:bin { "02010203" } - } //Z#578 + } //Z#579 /* Pacific/Niue */ :table { trans:intvector { -543069620, -173623200 } typeOffsets:intvector { -40780, 0, -40800, 0, -39600, 0 } typeMap:bin { "0102" } - } //Z#579 + } //Z#580 /* Pacific/Norfolk */ :table { transPre32:intvector { -1, 2117474184 } trans:intvector { -599656320, 152029800, 162916200, 1443882600, 1570287600, 1586012400, 1601737200 } @@ -2415,75 +2421,75 @@ zoneinfo64:table(nofallback) { finalRule { "AN" } finalRaw:int { 39600 } finalYear:int { 2021 } - } //Z#580 + } //Z#581 /* Pacific/Noumea */ :table { trans:intvector { -1829387148, 250002000, 257342400, 281451600, 288878400, 849366000, 857228400 } typeOffsets:intvector { 39948, 0, 39600, 0, 39600, 3600 } typeMap:bin { "01020102010201" } - } //Z#581 + } //Z#582 /* Pacific/Pago_Pago */ :table { transPre32:intvector { -1, 1849542664 } trans:intvector { -1861879032 } typeOffsets:intvector { 45432, 0, -40968, 0, -39600, 0 } typeMap:bin { "0102" } - links:intvector { 577, 582, 590, 631 } - } //Z#582 + links:intvector { 578, 583, 591, 632 } + } //Z#583 /* Pacific/Palau */ :table { transPre32:intvector { -1, 350343020, -1, 2117482220 } typeOffsets:intvector { -54124, 0, 32276, 0, 32400, 0 } typeMap:bin { "0102" } - } //Z#583 + } //Z#584 /* Pacific/Pitcairn */ :table { transPre32:intvector { -1, 2117545716 } trans:intvector { 893665800 } typeOffsets:intvector { -31220, 0, -30600, 0, -28800, 0 } typeMap:bin { "0102" } - } //Z#584 - /* Pacific/Pohnpei */ :int { 567 } //Z#585 - /* Pacific/Ponape */ :int { 567 } //Z#586 + } //Z#585 + /* Pacific/Pohnpei */ :int { 568 } //Z#586 + /* Pacific/Ponape */ :int { 568 } //Z#587 /* Pacific/Port_Moresby */ :table { transPre32:intvector { -1, 1454791176, -1, 1928176784 } typeOffsets:intvector { 35320, 0, 35312, 0, 36000, 0 } typeMap:bin { "0102" } - links:intvector { 229, 558, 587, 594, 597 } - } //Z#587 + links:intvector { 230, 559, 588, 595, 598 } + } //Z#588 /* Pacific/Rarotonga */ :table { transPre32:intvector { -1, 2085412040 } trans:intvector { -543072056, 279714600, 289387800, 309952800, 320837400, 341402400, 352287000, 372852000, 384341400, 404906400, 415791000, 436356000, 447240600, 467805600, 478690200, 499255200, 510139800, 530704800, 541589400, 562154400, 573643800, 594208800, 605093400, 625658400, 636543000, 657108000, 667992600 } typeOffsets:intvector { 48056, 0, -38344, 0, -37800, 0, -36000, 0, -36000, 1800 } typeMap:bin { "01020403040304030403040304030403040304030403040304030403" } - } //Z#588 - /* Pacific/Saipan */ :int { 568 } //Z#589 - /* Pacific/Samoa */ :int { 582 } //Z#590 + } //Z#589 + /* Pacific/Saipan */ :int { 569 } //Z#590 + /* Pacific/Samoa */ :int { 583 } //Z#591 /* Pacific/Tahiti */ :table { trans:intvector { -1806674504 } typeOffsets:intvector { -35896, 0, -36000, 0 } typeMap:bin { "01" } - } //Z#591 + } //Z#592 /* Pacific/Tarawa */ :table { transPre32:intvector { -1, 2117472972 } typeOffsets:intvector { 41524, 0, 43200, 0 } typeMap:bin { "01" } - links:intvector { 564, 575, 592, 595, 596 } - } //Z#592 + links:intvector { 565, 576, 593, 596, 597 } + } //Z#593 /* Pacific/Tongatapu */ :table { trans:intvector { -767189952, -284041200, 939214800, 953384400, 973342800, 980596800, 1004792400, 1012046400, 1478350800, 1484398800 } typeOffsets:intvector { 44352, 0, 44400, 0, 46800, 0, 46800, 3600 } typeMap:bin { "01020302030203020302" } - } //Z#593 - /* Pacific/Truk */ :int { 587 } //Z#594 - /* Pacific/Wake */ :int { 592 } //Z#595 - /* Pacific/Wallis */ :int { 592 } //Z#596 - /* Pacific/Yap */ :int { 587 } //Z#597 - /* Poland */ :int { 501 } //Z#598 - /* Portugal */ :int { 466 } //Z#599 - /* ROC */ :int { 319 } //Z#600 - /* ROK */ :int { 315 } //Z#601 - /* SST */ :int { 567 } //Z#602 - /* Singapore */ :int { 317 } //Z#603 + } //Z#594 + /* Pacific/Truk */ :int { 588 } //Z#595 + /* Pacific/Wake */ :int { 593 } //Z#596 + /* Pacific/Wallis */ :int { 593 } //Z#597 + /* Pacific/Yap */ :int { 588 } //Z#598 + /* Poland */ :int { 502 } //Z#599 + /* Portugal */ :int { 467 } //Z#600 + /* ROC */ :int { 320 } //Z#601 + /* ROK */ :int { 316 } //Z#602 + /* SST */ :int { 568 } //Z#603 + /* Singapore */ :int { 318 } //Z#604 /* SystemV/AST4 */ :table { typeOffsets:intvector { -14400, 0 } - } //Z#604 + } //Z#605 /* SystemV/AST4ADT */ :table { trans:intvector { -2135872800, -2120151600, -2104423200, -2088702000, -2072973600, -2056647600, -2040919200, -2025198000, -2009469600, -1993748400, -1978020000, -1962298800, -1946570400, -1930849200, -1915120800, -1898794800, -1883671200, -1867345200, -1851616800, -1835895600, -1820167200, -1804446000, -1788717600, -1772996400, -1757268000, -1741546800, -1725818400, -1709492400, -1693764000, -1678042800, -1662314400, -1646593200, -1630864800, -1615143600, -1599415200, -1583694000, -1567965600, -1551639600, -1536516000, -1520190000, -1504461600, -1488740400, -1473012000, -1457290800, -1441562400, -1425841200, -1410112800, -1394391600, -1378663200, -1362337200, -1347213600, -1330887600, -1315159200, -1299438000, -1283709600, -1267988400, -1252260000, -1236538800, -1220810400, -1205089200, -1189360800, -1173034800, -1157306400, -1141585200, -1125856800, -1110135600, -1094407200, -1078686000, -1062957600, -1047236400, -1031508000, -1015182000, -1000058400, -983732400, -968004000, -952282800, -936554400, -920833200, -905104800, -889383600, -873655200, -857934000, -842205600, -825879600, -810151200, -794430000, -778701600, -762980400, -747252000, -731530800, -715802400, -700081200, -684352800, -668026800, -652903200, -636577200, -620848800, -605127600, -589399200, -573678000, -557949600, -542228400, -526500000, -510778800, -495050400, -478724400, -463600800, -447274800, -431546400, -415825200, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 126684000, 154501200, 162367200, 183531600, 199260000, 215586000 } typeOffsets:intvector { -14400, 0, -14400, 3600 } @@ -2491,10 +2497,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -14400 } finalYear:int { 1977 } - } //Z#605 + } //Z#606 /* SystemV/CST6 */ :table { typeOffsets:intvector { -21600, 0 } - } //Z#606 + } //Z#607 /* SystemV/CST6CDT */ :table { trans:intvector { -2135865600, -2120144400, -2104416000, -2088694800, -2072966400, -2056640400, -2040912000, -2025190800, -2009462400, -1993741200, -1978012800, -1962291600, -1946563200, -1930842000, -1915113600, -1898787600, -1883664000, -1867338000, -1851609600, -1835888400, -1820160000, -1804438800, -1788710400, -1772989200, -1757260800, -1741539600, -1725811200, -1709485200, -1693756800, -1678035600, -1662307200, -1646586000, -1630857600, -1615136400, -1599408000, -1583686800, -1567958400, -1551632400, -1536508800, -1520182800, -1504454400, -1488733200, -1473004800, -1457283600, -1441555200, -1425834000, -1410105600, -1394384400, -1378656000, -1362330000, -1347206400, -1330880400, -1315152000, -1299430800, -1283702400, -1267981200, -1252252800, -1236531600, -1220803200, -1205082000, -1189353600, -1173027600, -1157299200, -1141578000, -1125849600, -1110128400, -1094400000, -1078678800, -1062950400, -1047229200, -1031500800, -1015174800, -1000051200, -983725200, -967996800, -952275600, -936547200, -920826000, -905097600, -889376400, -873648000, -857926800, -842198400, -825872400, -810144000, -794422800, -778694400, -762973200, -747244800, -731523600, -715795200, -700074000, -684345600, -668019600, -652896000, -636570000, -620841600, -605120400, -589392000, -573670800, -557942400, -542221200, -526492800, -510771600, -495043200, -478717200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 154508400, 162374400, 183538800, 199267200, 215593200 } typeOffsets:intvector { -21600, 0, -21600, 3600 } @@ -2502,10 +2508,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -21600 } finalYear:int { 1977 } - } //Z#607 + } //Z#608 /* SystemV/EST5 */ :table { typeOffsets:intvector { -18000, 0 } - } //Z#608 + } //Z#609 /* SystemV/EST5EDT */ :table { trans:intvector { -2135869200, -2120148000, -2104419600, -2088698400, -2072970000, -2056644000, -2040915600, -2025194400, -2009466000, -1993744800, -1978016400, -1962295200, -1946566800, -1930845600, -1915117200, -1898791200, -1883667600, -1867341600, -1851613200, -1835892000, -1820163600, -1804442400, -1788714000, -1772992800, -1757264400, -1741543200, -1725814800, -1709488800, -1693760400, -1678039200, -1662310800, -1646589600, -1630861200, -1615140000, -1599411600, -1583690400, -1567962000, -1551636000, -1536512400, -1520186400, -1504458000, -1488736800, -1473008400, -1457287200, -1441558800, -1425837600, -1410109200, -1394388000, -1378659600, -1362333600, -1347210000, -1330884000, -1315155600, -1299434400, -1283706000, -1267984800, -1252256400, -1236535200, -1220806800, -1205085600, -1189357200, -1173031200, -1157302800, -1141581600, -1125853200, -1110132000, -1094403600, -1078682400, -1062954000, -1047232800, -1031504400, -1015178400, -1000054800, -983728800, -968000400, -952279200, -936550800, -920829600, -905101200, -889380000, -873651600, -857930400, -842202000, -825876000, -810147600, -794426400, -778698000, -762976800, -747248400, -731527200, -715798800, -700077600, -684349200, -668023200, -652899600, -636573600, -620845200, -605124000, -589395600, -573674400, -557946000, -542224800, -526496400, -510775200, -495046800, -478720800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 154504800, 162370800, 183535200, 199263600, 215589600 } typeOffsets:intvector { -18000, 0, -18000, 3600 } @@ -2513,13 +2519,13 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -18000 } finalYear:int { 1977 } - } //Z#609 + } //Z#610 /* SystemV/HST10 */ :table { typeOffsets:intvector { -36000, 0 } - } //Z#610 + } //Z#611 /* SystemV/MST7 */ :table { typeOffsets:intvector { -25200, 0 } - } //Z#611 + } //Z#612 /* SystemV/MST7MDT */ :table { trans:intvector { -2135862000, -2120140800, -2104412400, -2088691200, -2072962800, -2056636800, -2040908400, -2025187200, -2009458800, -1993737600, -1978009200, -1962288000, -1946559600, -1930838400, -1915110000, -1898784000, -1883660400, -1867334400, -1851606000, -1835884800, -1820156400, -1804435200, -1788706800, -1772985600, -1757257200, -1741536000, -1725807600, -1709481600, -1693753200, -1678032000, -1662303600, -1646582400, -1630854000, -1615132800, -1599404400, -1583683200, -1567954800, -1551628800, -1536505200, -1520179200, -1504450800, -1488729600, -1473001200, -1457280000, -1441551600, -1425830400, -1410102000, -1394380800, -1378652400, -1362326400, -1347202800, -1330876800, -1315148400, -1299427200, -1283698800, -1267977600, -1252249200, -1236528000, -1220799600, -1205078400, -1189350000, -1173024000, -1157295600, -1141574400, -1125846000, -1110124800, -1094396400, -1078675200, -1062946800, -1047225600, -1031497200, -1015171200, -1000047600, -983721600, -967993200, -952272000, -936543600, -920822400, -905094000, -889372800, -873644400, -857923200, -842194800, -825868800, -810140400, -794419200, -778690800, -762969600, -747241200, -731520000, -715791600, -700070400, -684342000, -668016000, -652892400, -636566400, -620838000, -605116800, -589388400, -573667200, -557938800, -542217600, -526489200, -510768000, -495039600, -478713600, -463590000, -447264000, -431535600, -415814400, -400086000, -384364800, -368636400, -352915200, -337186800, -321465600, -305737200, -289411200, -273682800, -257961600, -242233200, -226512000, -210783600, -195062400, -179334000, -163612800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 154512000, 162378000, 183542400, 199270800, 215596800 } typeOffsets:intvector { -25200, 0, -25200, 3600 } @@ -2527,10 +2533,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -25200 } finalYear:int { 1977 } - } //Z#612 + } //Z#613 /* SystemV/PST8 */ :table { typeOffsets:intvector { -28800, 0 } - } //Z#613 + } //Z#614 /* SystemV/PST8PDT */ :table { trans:intvector { -2135858400, -2120137200, -2104408800, -2088687600, -2072959200, -2056633200, -2040904800, -2025183600, -2009455200, -1993734000, -1978005600, -1962284400, -1946556000, -1930834800, -1915106400, -1898780400, -1883656800, -1867330800, -1851602400, -1835881200, -1820152800, -1804431600, -1788703200, -1772982000, -1757253600, -1741532400, -1725804000, -1709478000, -1693749600, -1678028400, -1662300000, -1646578800, -1630850400, -1615129200, -1599400800, -1583679600, -1567951200, -1551625200, -1536501600, -1520175600, -1504447200, -1488726000, -1472997600, -1457276400, -1441548000, -1425826800, -1410098400, -1394377200, -1378648800, -1362322800, -1347199200, -1330873200, -1315144800, -1299423600, -1283695200, -1267974000, -1252245600, -1236524400, -1220796000, -1205074800, -1189346400, -1173020400, -1157292000, -1141570800, -1125842400, -1110121200, -1094392800, -1078671600, -1062943200, -1047222000, -1031493600, -1015167600, -1000044000, -983718000, -967989600, -952268400, -936540000, -920818800, -905090400, -889369200, -873640800, -857919600, -842191200, -825865200, -810136800, -794415600, -778687200, -762966000, -747237600, -731516400, -715788000, -700066800, -684338400, -668012400, -652888800, -636562800, -620834400, -605113200, -589384800, -573663600, -557935200, -542214000, -526485600, -510764400, -495036000, -478710000, -463586400, -447260400, -431532000, -415810800, -400082400, -384361200, -368632800, -352911600, -337183200, -321462000, -305733600, -289407600, -273679200, -257958000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 154515600, 162381600, 183546000, 199274400, 215600400 } typeOffsets:intvector { -28800, 0, -28800, 3600 } @@ -2538,10 +2544,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -28800 } finalYear:int { 1977 } - } //Z#614 + } //Z#615 /* SystemV/YST9 */ :table { typeOffsets:intvector { -32400, 0 } - } //Z#615 + } //Z#616 /* SystemV/YST9YDT */ :table { trans:intvector { -2135854800, -2120133600, -2104405200, -2088684000, -2072955600, -2056629600, -2040901200, -2025180000, -2009451600, -1993730400, -1978002000, -1962280800, -1946552400, -1930831200, -1915102800, -1898776800, -1883653200, -1867327200, -1851598800, -1835877600, -1820149200, -1804428000, -1788699600, -1772978400, -1757250000, -1741528800, -1725800400, -1709474400, -1693746000, -1678024800, -1662296400, -1646575200, -1630846800, -1615125600, -1599397200, -1583676000, -1567947600, -1551621600, -1536498000, -1520172000, -1504443600, -1488722400, -1472994000, -1457272800, -1441544400, -1425823200, -1410094800, -1394373600, -1378645200, -1362319200, -1347195600, -1330869600, -1315141200, -1299420000, -1283691600, -1267970400, -1252242000, -1236520800, -1220792400, -1205071200, -1189342800, -1173016800, -1157288400, -1141567200, -1125838800, -1110117600, -1094389200, -1078668000, -1062939600, -1047218400, -1031490000, -1015164000, -1000040400, -983714400, -967986000, -952264800, -936536400, -920815200, -905086800, -889365600, -873637200, -857916000, -842187600, -825861600, -810133200, -794412000, -778683600, -762962400, -747234000, -731512800, -715784400, -700063200, -684334800, -668008800, -652885200, -636559200, -620830800, -605109600, -589381200, -573660000, -557931600, -542210400, -526482000, -510760800, -495032400, -478706400, -463582800, -447256800, -431528400, -415807200, -400078800, -384357600, -368629200, -352908000, -337179600, -321458400, -305730000, -289404000, -273675600, -257954400, -242226000, -226504800, -210776400, -195055200, -179326800, -163605600, -147877200, -131551200, -116427600, -100101600, -84373200, -68652000, -52923600, -37202400, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 154519200, 162385200, 183549600, 199278000, 215604000 } typeOffsets:intvector { -32400, 0, -32400, 3600 } @@ -2549,28 +2555,28 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -32400 } finalYear:int { 1977 } - } //Z#616 - /* Turkey */ :int { 460 } //Z#617 - /* UCT */ :int { 437 } //Z#618 - /* US/Alaska */ :int { 60 } //Z#619 - /* US/Aleutian */ :int { 59 } //Z#620 - /* US/Arizona */ :int { 186 } //Z#621 - /* US/Central */ :int { 98 } //Z#622 - /* US/East-Indiana */ :int { 132 } //Z#623 - /* US/Eastern */ :int { 174 } //Z#624 - /* US/Hawaii */ :int { 569 } //Z#625 - /* US/Indiana-Starke */ :int { 133 } //Z#626 - /* US/Michigan */ :int { 111 } //Z#627 - /* US/Mountain */ :int { 110 } //Z#628 - /* US/Pacific */ :int { 152 } //Z#629 - /* US/Pacific-New */ :int { 152 } //Z#630 - /* US/Samoa */ :int { 582 } //Z#631 - /* UTC */ :int { 437 } //Z#632 - /* Universal */ :int { 437 } //Z#633 - /* VST */ :int { 273 } //Z#634 - /* W-SU */ :int { 475 } //Z#635 - /* WET */ :int { 466 } //Z#636 - /* Zulu */ :int { 437 } //Z#637 + } //Z#617 + /* Turkey */ :int { 461 } //Z#618 + /* UCT */ :int { 438 } //Z#619 + /* US/Alaska */ :int { 60 } //Z#620 + /* US/Aleutian */ :int { 59 } //Z#621 + /* US/Arizona */ :int { 187 } //Z#622 + /* US/Central */ :int { 98 } //Z#623 + /* US/East-Indiana */ :int { 133 } //Z#624 + /* US/Eastern */ :int { 175 } //Z#625 + /* US/Hawaii */ :int { 570 } //Z#626 + /* US/Indiana-Starke */ :int { 134 } //Z#627 + /* US/Michigan */ :int { 112 } //Z#628 + /* US/Mountain */ :int { 111 } //Z#629 + /* US/Pacific */ :int { 153 } //Z#630 + /* US/Pacific-New */ :int { 153 } //Z#631 + /* US/Samoa */ :int { 583 } //Z#632 + /* UTC */ :int { 438 } //Z#633 + /* Universal */ :int { 438 } //Z#634 + /* VST */ :int { 274 } //Z#635 + /* W-SU */ :int { 476 } //Z#636 + /* WET */ :int { 467 } //Z#637 + /* Zulu */ :int { 438 } //Z#638 } Names { "ACT","AET","AGT","ART","AST","Africa/Abidjan","Africa/Accra" // 6 @@ -2607,158 +2613,158 @@ zoneinfo64:table(nofallback) { ,"America/Catamarca","America/Cayenne","America/Cayman" // 97 ,"America/Chicago","America/Chihuahua","America/Ciudad_Juarez" // 100 ,"America/Coral_Harbour","America/Cordoba","America/Costa_Rica" // 103 - ,"America/Creston","America/Cuiaba","America/Curacao" // 106 - ,"America/Danmarkshavn","America/Dawson","America/Dawson_Creek" // 109 - ,"America/Denver","America/Detroit","America/Dominica" // 112 - ,"America/Edmonton","America/Eirunepe","America/El_Salvador" // 115 - ,"America/Ensenada","America/Fort_Nelson","America/Fort_Wayne" // 118 - ,"America/Fortaleza","America/Glace_Bay","America/Godthab" // 121 - ,"America/Goose_Bay","America/Grand_Turk","America/Grenada" // 124 - ,"America/Guadeloupe","America/Guatemala","America/Guayaquil" // 127 - ,"America/Guyana","America/Halifax","America/Havana" // 130 - ,"America/Hermosillo","America/Indiana/Indianapolis" // 132 - ,"America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg" // 135 - ,"America/Indiana/Tell_City","America/Indiana/Vevay" // 137 - ,"America/Indiana/Vincennes","America/Indiana/Winamac" // 139 - ,"America/Indianapolis","America/Inuvik","America/Iqaluit" // 142 - ,"America/Jamaica","America/Jujuy","America/Juneau" // 145 - ,"America/Kentucky/Louisville","America/Kentucky/Monticello" // 147 - ,"America/Knox_IN","America/Kralendijk","America/La_Paz" // 150 - ,"America/Lima","America/Los_Angeles","America/Louisville" // 153 - ,"America/Lower_Princes","America/Maceio","America/Managua" // 156 - ,"America/Manaus","America/Marigot","America/Martinique" // 159 - ,"America/Matamoros","America/Mazatlan","America/Mendoza" // 162 - ,"America/Menominee","America/Merida","America/Metlakatla" // 165 - ,"America/Mexico_City","America/Miquelon","America/Moncton" // 168 - ,"America/Monterrey","America/Montevideo","America/Montreal" // 171 - ,"America/Montserrat","America/Nassau","America/New_York" // 174 - ,"America/Nipigon","America/Nome","America/Noronha" // 177 - ,"America/North_Dakota/Beulah","America/North_Dakota/Center" // 179 - ,"America/North_Dakota/New_Salem","America/Nuuk","America/Ojinaga" // 182 - ,"America/Panama","America/Pangnirtung","America/Paramaribo" // 185 - ,"America/Phoenix","America/Port-au-Prince","America/Port_of_Spain" // 188 - ,"America/Porto_Acre","America/Porto_Velho","America/Puerto_Rico" // 191 - ,"America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet" // 194 - ,"America/Recife","America/Regina","America/Resolute" // 197 - ,"America/Rio_Branco","America/Rosario","America/Santa_Isabel" // 200 - ,"America/Santarem","America/Santiago","America/Santo_Domingo" // 203 - ,"America/Sao_Paulo","America/Scoresbysund","America/Shiprock" // 206 - ,"America/Sitka","America/St_Barthelemy","America/St_Johns" // 209 - ,"America/St_Kitts","America/St_Lucia","America/St_Thomas" // 212 - ,"America/St_Vincent","America/Swift_Current","America/Tegucigalpa" // 215 - ,"America/Thule","America/Thunder_Bay","America/Tijuana" // 218 - ,"America/Toronto","America/Tortola","America/Vancouver" // 221 - ,"America/Virgin","America/Whitehorse","America/Winnipeg" // 224 - ,"America/Yakutat","America/Yellowknife","Antarctica/Casey" // 227 - ,"Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie" // 230 - ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 233 - ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 236 - ,"Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen" // 239 - ,"Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr" // 243 - ,"Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad" // 247 - ,"Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku" // 251 - ,"Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek" // 255 - ,"Asia/Brunei","Asia/Calcutta","Asia/Chita","Asia/Choibalsan" // 259 - ,"Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca" // 263 - ,"Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai" // 267 - ,"Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Harbin" // 271 - ,"Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong" // 274 - ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 278 - ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 282 - ,"Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Katmandu" // 286 - ,"Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk" // 289 - ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 293 - ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 297 - ,"Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk" // 301 - ,"Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak" // 305 - ,"Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda" // 309 - ,"Asia/Rangoon","Asia/Riyadh","Asia/Saigon","Asia/Sakhalin" // 313 - ,"Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore" // 317 - ,"Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent" // 320 - ,"Asia/Tbilisi","Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu" // 324 - ,"Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ujung_Pandang" // 328 - ,"Asia/Ulaanbaatar","Asia/Ulan_Bator","Asia/Urumqi" // 331 - ,"Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok" // 334 - ,"Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg" // 337 - ,"Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda" // 340 - ,"Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe" // 343 - ,"Atlantic/Faroe","Atlantic/Jan_Mayen","Atlantic/Madeira" // 346 - ,"Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena" // 349 - ,"Atlantic/Stanley","Australia/ACT","Australia/Adelaide" // 352 - ,"Australia/Brisbane","Australia/Broken_Hill","Australia/Canberra" // 355 - ,"Australia/Currie","Australia/Darwin","Australia/Eucla" // 358 - ,"Australia/Hobart","Australia/LHI","Australia/Lindeman" // 361 - ,"Australia/Lord_Howe","Australia/Melbourne","Australia/NSW" // 364 - ,"Australia/North","Australia/Perth","Australia/Queensland" // 367 - ,"Australia/South","Australia/Sydney","Australia/Tasmania" // 370 - ,"Australia/Victoria","Australia/West","Australia/Yancowinna" // 373 - ,"BET","BST","Brazil/Acre","Brazil/DeNoronha","Brazil/East" // 378 - ,"Brazil/West","CAT","CET","CNT","CST","CST6CDT","CTT" // 385 - ,"Canada/Atlantic","Canada/Central","Canada/East-Saskatchewan" // 388 - ,"Canada/Eastern","Canada/Mountain","Canada/Newfoundland" // 391 - ,"Canada/Pacific","Canada/Saskatchewan","Canada/Yukon" // 394 - ,"Chile/Continental","Chile/EasterIsland","Cuba","EAT" // 398 - ,"ECT","EET","EST","EST5EDT","Egypt","Eire","Etc/GMT" // 405 - ,"Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11" // 409 - ,"Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5" // 414 - ,"Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0" // 419 - ,"Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12" // 423 - ,"Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3" // 427 - ,"Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8" // 432 - ,"Etc/GMT-9","Etc/GMT0","Etc/Greenwich","Etc/UCT","Etc/UTC" // 437 - ,"Etc/Universal","Etc/Unknown","Etc/Zulu","Europe/Amsterdam" // 441 - ,"Europe/Andorra","Europe/Astrakhan","Europe/Athens" // 444 - ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 447 - ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 450 - ,"Europe/Budapest","Europe/Busingen","Europe/Chisinau" // 453 - ,"Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar" // 456 - ,"Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man" // 459 - ,"Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad" // 462 - ,"Europe/Kiev","Europe/Kirov","Europe/Kyiv","Europe/Lisbon" // 466 - ,"Europe/Ljubljana","Europe/London","Europe/Luxembourg" // 469 - ,"Europe/Madrid","Europe/Malta","Europe/Mariehamn" // 472 - ,"Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Nicosia" // 476 - ,"Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague" // 480 - ,"Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino" // 484 - ,"Europe/Sarajevo","Europe/Saratov","Europe/Simferopol" // 487 - ,"Europe/Skopje","Europe/Sofia","Europe/Stockholm" // 490 - ,"Europe/Tallinn","Europe/Tirane","Europe/Tiraspol" // 493 - ,"Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz" // 496 - ,"Europe/Vatican","Europe/Vienna","Europe/Vilnius" // 499 - ,"Europe/Volgograd","Europe/Warsaw","Europe/Zagreb" // 502 - ,"Europe/Zaporozhye","Europe/Zurich","Factory","GB" // 506 - ,"GB-Eire","GMT","GMT+0","GMT-0","GMT0","Greenwich" // 512 - ,"HST","Hongkong","IET","IST","Iceland","Indian/Antananarivo" // 518 - ,"Indian/Chagos","Indian/Christmas","Indian/Cocos" // 521 - ,"Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 525 - ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 528 - ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 534 - ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 540 - ,"Mexico/BajaSur","Mexico/General","NET","NST","NZ" // 545 - ,"NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST","PST8PDT" // 553 - ,"Pacific/Apia","Pacific/Auckland","Pacific/Bougainville" // 556 - ,"Pacific/Chatham","Pacific/Chuuk","Pacific/Easter" // 559 - ,"Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo" // 562 - ,"Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos" // 565 - ,"Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam" // 568 - ,"Pacific/Honolulu","Pacific/Johnston","Pacific/Kanton" // 571 - ,"Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein" // 574 - ,"Pacific/Majuro","Pacific/Marquesas","Pacific/Midway" // 577 - ,"Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 581 - ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 584 - ,"Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby" // 587 - ,"Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa" // 590 - ,"Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu" // 593 - ,"Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap" // 597 - ,"Poland","Portugal","ROC","ROK","SST","Singapore" // 603 - ,"SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 607 - ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 611 - ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 614 - ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 619 - ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 623 - ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 627 - ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 631 - ,"UTC","Universal","VST","W-SU","WET","Zulu" // 637 + ,"America/Coyhaique","America/Creston","America/Cuiaba" // 106 + ,"America/Curacao","America/Danmarkshavn","America/Dawson" // 109 + ,"America/Dawson_Creek","America/Denver","America/Detroit" // 112 + ,"America/Dominica","America/Edmonton","America/Eirunepe" // 115 + ,"America/El_Salvador","America/Ensenada","America/Fort_Nelson" // 118 + ,"America/Fort_Wayne","America/Fortaleza","America/Glace_Bay" // 121 + ,"America/Godthab","America/Goose_Bay","America/Grand_Turk" // 124 + ,"America/Grenada","America/Guadeloupe","America/Guatemala" // 127 + ,"America/Guayaquil","America/Guyana","America/Halifax" // 130 + ,"America/Havana","America/Hermosillo","America/Indiana/Indianapolis" // 133 + ,"America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg" // 136 + ,"America/Indiana/Tell_City","America/Indiana/Vevay" // 138 + ,"America/Indiana/Vincennes","America/Indiana/Winamac" // 140 + ,"America/Indianapolis","America/Inuvik","America/Iqaluit" // 143 + ,"America/Jamaica","America/Jujuy","America/Juneau" // 146 + ,"America/Kentucky/Louisville","America/Kentucky/Monticello" // 148 + ,"America/Knox_IN","America/Kralendijk","America/La_Paz" // 151 + ,"America/Lima","America/Los_Angeles","America/Louisville" // 154 + ,"America/Lower_Princes","America/Maceio","America/Managua" // 157 + ,"America/Manaus","America/Marigot","America/Martinique" // 160 + ,"America/Matamoros","America/Mazatlan","America/Mendoza" // 163 + ,"America/Menominee","America/Merida","America/Metlakatla" // 166 + ,"America/Mexico_City","America/Miquelon","America/Moncton" // 169 + ,"America/Monterrey","America/Montevideo","America/Montreal" // 172 + ,"America/Montserrat","America/Nassau","America/New_York" // 175 + ,"America/Nipigon","America/Nome","America/Noronha" // 178 + ,"America/North_Dakota/Beulah","America/North_Dakota/Center" // 180 + ,"America/North_Dakota/New_Salem","America/Nuuk","America/Ojinaga" // 183 + ,"America/Panama","America/Pangnirtung","America/Paramaribo" // 186 + ,"America/Phoenix","America/Port-au-Prince","America/Port_of_Spain" // 189 + ,"America/Porto_Acre","America/Porto_Velho","America/Puerto_Rico" // 192 + ,"America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet" // 195 + ,"America/Recife","America/Regina","America/Resolute" // 198 + ,"America/Rio_Branco","America/Rosario","America/Santa_Isabel" // 201 + ,"America/Santarem","America/Santiago","America/Santo_Domingo" // 204 + ,"America/Sao_Paulo","America/Scoresbysund","America/Shiprock" // 207 + ,"America/Sitka","America/St_Barthelemy","America/St_Johns" // 210 + ,"America/St_Kitts","America/St_Lucia","America/St_Thomas" // 213 + ,"America/St_Vincent","America/Swift_Current","America/Tegucigalpa" // 216 + ,"America/Thule","America/Thunder_Bay","America/Tijuana" // 219 + ,"America/Toronto","America/Tortola","America/Vancouver" // 222 + ,"America/Virgin","America/Whitehorse","America/Winnipeg" // 225 + ,"America/Yakutat","America/Yellowknife","Antarctica/Casey" // 228 + ,"Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie" // 231 + ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 234 + ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 237 + ,"Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen" // 240 + ,"Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr" // 244 + ,"Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad" // 248 + ,"Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku" // 252 + ,"Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek" // 256 + ,"Asia/Brunei","Asia/Calcutta","Asia/Chita","Asia/Choibalsan" // 260 + ,"Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca" // 264 + ,"Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai" // 268 + ,"Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Harbin" // 272 + ,"Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong" // 275 + ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 279 + ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 283 + ,"Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Katmandu" // 287 + ,"Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk" // 290 + ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 294 + ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 298 + ,"Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk" // 302 + ,"Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak" // 306 + ,"Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda" // 310 + ,"Asia/Rangoon","Asia/Riyadh","Asia/Saigon","Asia/Sakhalin" // 314 + ,"Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore" // 318 + ,"Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent" // 321 + ,"Asia/Tbilisi","Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu" // 325 + ,"Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ujung_Pandang" // 329 + ,"Asia/Ulaanbaatar","Asia/Ulan_Bator","Asia/Urumqi" // 332 + ,"Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok" // 335 + ,"Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg" // 338 + ,"Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda" // 341 + ,"Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe" // 344 + ,"Atlantic/Faroe","Atlantic/Jan_Mayen","Atlantic/Madeira" // 347 + ,"Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena" // 350 + ,"Atlantic/Stanley","Australia/ACT","Australia/Adelaide" // 353 + ,"Australia/Brisbane","Australia/Broken_Hill","Australia/Canberra" // 356 + ,"Australia/Currie","Australia/Darwin","Australia/Eucla" // 359 + ,"Australia/Hobart","Australia/LHI","Australia/Lindeman" // 362 + ,"Australia/Lord_Howe","Australia/Melbourne","Australia/NSW" // 365 + ,"Australia/North","Australia/Perth","Australia/Queensland" // 368 + ,"Australia/South","Australia/Sydney","Australia/Tasmania" // 371 + ,"Australia/Victoria","Australia/West","Australia/Yancowinna" // 374 + ,"BET","BST","Brazil/Acre","Brazil/DeNoronha","Brazil/East" // 379 + ,"Brazil/West","CAT","CET","CNT","CST","CST6CDT","CTT" // 386 + ,"Canada/Atlantic","Canada/Central","Canada/East-Saskatchewan" // 389 + ,"Canada/Eastern","Canada/Mountain","Canada/Newfoundland" // 392 + ,"Canada/Pacific","Canada/Saskatchewan","Canada/Yukon" // 395 + ,"Chile/Continental","Chile/EasterIsland","Cuba","EAT" // 399 + ,"ECT","EET","EST","EST5EDT","Egypt","Eire","Etc/GMT" // 406 + ,"Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11" // 410 + ,"Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5" // 415 + ,"Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0" // 420 + ,"Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12" // 424 + ,"Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3" // 428 + ,"Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8" // 433 + ,"Etc/GMT-9","Etc/GMT0","Etc/Greenwich","Etc/UCT","Etc/UTC" // 438 + ,"Etc/Universal","Etc/Unknown","Etc/Zulu","Europe/Amsterdam" // 442 + ,"Europe/Andorra","Europe/Astrakhan","Europe/Athens" // 445 + ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 448 + ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 451 + ,"Europe/Budapest","Europe/Busingen","Europe/Chisinau" // 454 + ,"Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar" // 457 + ,"Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man" // 460 + ,"Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad" // 463 + ,"Europe/Kiev","Europe/Kirov","Europe/Kyiv","Europe/Lisbon" // 467 + ,"Europe/Ljubljana","Europe/London","Europe/Luxembourg" // 470 + ,"Europe/Madrid","Europe/Malta","Europe/Mariehamn" // 473 + ,"Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Nicosia" // 477 + ,"Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague" // 481 + ,"Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino" // 485 + ,"Europe/Sarajevo","Europe/Saratov","Europe/Simferopol" // 488 + ,"Europe/Skopje","Europe/Sofia","Europe/Stockholm" // 491 + ,"Europe/Tallinn","Europe/Tirane","Europe/Tiraspol" // 494 + ,"Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz" // 497 + ,"Europe/Vatican","Europe/Vienna","Europe/Vilnius" // 500 + ,"Europe/Volgograd","Europe/Warsaw","Europe/Zagreb" // 503 + ,"Europe/Zaporozhye","Europe/Zurich","Factory","GB" // 507 + ,"GB-Eire","GMT","GMT+0","GMT-0","GMT0","Greenwich" // 513 + ,"HST","Hongkong","IET","IST","Iceland","Indian/Antananarivo" // 519 + ,"Indian/Chagos","Indian/Christmas","Indian/Cocos" // 522 + ,"Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 526 + ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 529 + ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 535 + ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 541 + ,"Mexico/BajaSur","Mexico/General","NET","NST","NZ" // 546 + ,"NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST","PST8PDT" // 554 + ,"Pacific/Apia","Pacific/Auckland","Pacific/Bougainville" // 557 + ,"Pacific/Chatham","Pacific/Chuuk","Pacific/Easter" // 560 + ,"Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo" // 563 + ,"Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos" // 566 + ,"Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam" // 569 + ,"Pacific/Honolulu","Pacific/Johnston","Pacific/Kanton" // 572 + ,"Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein" // 575 + ,"Pacific/Majuro","Pacific/Marquesas","Pacific/Midway" // 578 + ,"Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 582 + ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 585 + ,"Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby" // 588 + ,"Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa" // 591 + ,"Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu" // 594 + ,"Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap" // 598 + ,"Poland","Portugal","ROC","ROK","SST","Singapore" // 604 + ,"SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 608 + ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 612 + ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 615 + ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 620 + ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 624 + ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 628 + ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 632 + ,"UTC","Universal","VST","W-SU","WET","Zulu" // 638 } Rules { AN:intvector { @@ -2933,539 +2939,540 @@ zoneinfo64:table(nofallback) { "CA", //Z#101 America/Coral_Harbour "AR", //Z#102 America/Cordoba "CR", //Z#103 America/Costa_Rica - "CA", //Z#104 America/Creston - "BR", //Z#105 America/Cuiaba - "CW", //Z#106 America/Curacao - "GL", //Z#107 America/Danmarkshavn - "CA", //Z#108 America/Dawson - "CA", //Z#109 America/Dawson_Creek - "US", //Z#110 America/Denver - "US", //Z#111 America/Detroit - "DM", //Z#112 America/Dominica - "CA", //Z#113 America/Edmonton - "BR", //Z#114 America/Eirunepe - "SV", //Z#115 America/El_Salvador - "MX", //Z#116 America/Ensenada - "CA", //Z#117 America/Fort_Nelson - "US", //Z#118 America/Fort_Wayne - "BR", //Z#119 America/Fortaleza - "CA", //Z#120 America/Glace_Bay - "GL", //Z#121 America/Godthab - "CA", //Z#122 America/Goose_Bay - "TC", //Z#123 America/Grand_Turk - "GD", //Z#124 America/Grenada - "GP", //Z#125 America/Guadeloupe - "GT", //Z#126 America/Guatemala - "EC", //Z#127 America/Guayaquil - "GY", //Z#128 America/Guyana - "CA", //Z#129 America/Halifax - "CU", //Z#130 America/Havana - "MX", //Z#131 America/Hermosillo - "US", //Z#132 America/Indiana/Indianapolis - "US", //Z#133 America/Indiana/Knox - "US", //Z#134 America/Indiana/Marengo - "US", //Z#135 America/Indiana/Petersburg - "US", //Z#136 America/Indiana/Tell_City - "US", //Z#137 America/Indiana/Vevay - "US", //Z#138 America/Indiana/Vincennes - "US", //Z#139 America/Indiana/Winamac - "US", //Z#140 America/Indianapolis - "CA", //Z#141 America/Inuvik - "CA", //Z#142 America/Iqaluit - "JM", //Z#143 America/Jamaica - "AR", //Z#144 America/Jujuy - "US", //Z#145 America/Juneau - "US", //Z#146 America/Kentucky/Louisville - "US", //Z#147 America/Kentucky/Monticello - "US", //Z#148 America/Knox_IN - "BQ", //Z#149 America/Kralendijk - "BO", //Z#150 America/La_Paz - "PE", //Z#151 America/Lima - "US", //Z#152 America/Los_Angeles - "US", //Z#153 America/Louisville - "SX", //Z#154 America/Lower_Princes - "BR", //Z#155 America/Maceio - "NI", //Z#156 America/Managua - "BR", //Z#157 America/Manaus - "MF", //Z#158 America/Marigot - "MQ", //Z#159 America/Martinique - "MX", //Z#160 America/Matamoros - "MX", //Z#161 America/Mazatlan - "AR", //Z#162 America/Mendoza - "US", //Z#163 America/Menominee - "MX", //Z#164 America/Merida - "US", //Z#165 America/Metlakatla - "MX", //Z#166 America/Mexico_City - "PM", //Z#167 America/Miquelon - "CA", //Z#168 America/Moncton - "MX", //Z#169 America/Monterrey - "UY", //Z#170 America/Montevideo - "CA", //Z#171 America/Montreal - "MS", //Z#172 America/Montserrat - "BS", //Z#173 America/Nassau - "US", //Z#174 America/New_York - "CA", //Z#175 America/Nipigon - "US", //Z#176 America/Nome - "BR", //Z#177 America/Noronha - "US", //Z#178 America/North_Dakota/Beulah - "US", //Z#179 America/North_Dakota/Center - "US", //Z#180 America/North_Dakota/New_Salem - "GL", //Z#181 America/Nuuk - "MX", //Z#182 America/Ojinaga - "PA", //Z#183 America/Panama - "CA", //Z#184 America/Pangnirtung - "SR", //Z#185 America/Paramaribo - "US", //Z#186 America/Phoenix - "HT", //Z#187 America/Port-au-Prince - "TT", //Z#188 America/Port_of_Spain - "BR", //Z#189 America/Porto_Acre - "BR", //Z#190 America/Porto_Velho - "PR", //Z#191 America/Puerto_Rico - "CL", //Z#192 America/Punta_Arenas - "CA", //Z#193 America/Rainy_River - "CA", //Z#194 America/Rankin_Inlet - "BR", //Z#195 America/Recife - "CA", //Z#196 America/Regina - "CA", //Z#197 America/Resolute - "BR", //Z#198 America/Rio_Branco - "AR", //Z#199 America/Rosario - "MX", //Z#200 America/Santa_Isabel - "BR", //Z#201 America/Santarem - "CL", //Z#202 America/Santiago - "DO", //Z#203 America/Santo_Domingo - "BR", //Z#204 America/Sao_Paulo - "GL", //Z#205 America/Scoresbysund - "US", //Z#206 America/Shiprock - "US", //Z#207 America/Sitka - "BL", //Z#208 America/St_Barthelemy - "CA", //Z#209 America/St_Johns - "KN", //Z#210 America/St_Kitts - "LC", //Z#211 America/St_Lucia - "VI", //Z#212 America/St_Thomas - "VC", //Z#213 America/St_Vincent - "CA", //Z#214 America/Swift_Current - "HN", //Z#215 America/Tegucigalpa - "GL", //Z#216 America/Thule - "CA", //Z#217 America/Thunder_Bay - "MX", //Z#218 America/Tijuana - "CA", //Z#219 America/Toronto - "VG", //Z#220 America/Tortola - "CA", //Z#221 America/Vancouver - "VI", //Z#222 America/Virgin - "CA", //Z#223 America/Whitehorse - "CA", //Z#224 America/Winnipeg - "US", //Z#225 America/Yakutat - "CA", //Z#226 America/Yellowknife - "AQ", //Z#227 Antarctica/Casey - "AQ", //Z#228 Antarctica/Davis - "AQ", //Z#229 Antarctica/DumontDUrville - "AU", //Z#230 Antarctica/Macquarie - "AQ", //Z#231 Antarctica/Mawson - "AQ", //Z#232 Antarctica/McMurdo - "AQ", //Z#233 Antarctica/Palmer - "AQ", //Z#234 Antarctica/Rothera - "AQ", //Z#235 Antarctica/South_Pole - "AQ", //Z#236 Antarctica/Syowa - "AQ", //Z#237 Antarctica/Troll - "AQ", //Z#238 Antarctica/Vostok - "SJ", //Z#239 Arctic/Longyearbyen - "YE", //Z#240 Asia/Aden - "KZ", //Z#241 Asia/Almaty - "JO", //Z#242 Asia/Amman - "RU", //Z#243 Asia/Anadyr - "KZ", //Z#244 Asia/Aqtau - "KZ", //Z#245 Asia/Aqtobe - "TM", //Z#246 Asia/Ashgabat - "TM", //Z#247 Asia/Ashkhabad - "KZ", //Z#248 Asia/Atyrau - "IQ", //Z#249 Asia/Baghdad - "BH", //Z#250 Asia/Bahrain - "AZ", //Z#251 Asia/Baku - "TH", //Z#252 Asia/Bangkok - "RU", //Z#253 Asia/Barnaul - "LB", //Z#254 Asia/Beirut - "KG", //Z#255 Asia/Bishkek - "BN", //Z#256 Asia/Brunei - "IN", //Z#257 Asia/Calcutta - "RU", //Z#258 Asia/Chita - "MN", //Z#259 Asia/Choibalsan - "CN", //Z#260 Asia/Chongqing - "CN", //Z#261 Asia/Chungking - "LK", //Z#262 Asia/Colombo - "BD", //Z#263 Asia/Dacca - "SY", //Z#264 Asia/Damascus - "BD", //Z#265 Asia/Dhaka - "TL", //Z#266 Asia/Dili - "AE", //Z#267 Asia/Dubai - "TJ", //Z#268 Asia/Dushanbe - "CY", //Z#269 Asia/Famagusta - "PS", //Z#270 Asia/Gaza - "CN", //Z#271 Asia/Harbin - "PS", //Z#272 Asia/Hebron - "VN", //Z#273 Asia/Ho_Chi_Minh - "HK", //Z#274 Asia/Hong_Kong - "MN", //Z#275 Asia/Hovd - "RU", //Z#276 Asia/Irkutsk - "TR", //Z#277 Asia/Istanbul - "ID", //Z#278 Asia/Jakarta - "ID", //Z#279 Asia/Jayapura - "IL", //Z#280 Asia/Jerusalem - "AF", //Z#281 Asia/Kabul - "RU", //Z#282 Asia/Kamchatka - "PK", //Z#283 Asia/Karachi - "CN", //Z#284 Asia/Kashgar - "NP", //Z#285 Asia/Kathmandu - "NP", //Z#286 Asia/Katmandu - "RU", //Z#287 Asia/Khandyga - "IN", //Z#288 Asia/Kolkata - "RU", //Z#289 Asia/Krasnoyarsk - "MY", //Z#290 Asia/Kuala_Lumpur - "MY", //Z#291 Asia/Kuching - "KW", //Z#292 Asia/Kuwait - "MO", //Z#293 Asia/Macao - "MO", //Z#294 Asia/Macau - "RU", //Z#295 Asia/Magadan - "ID", //Z#296 Asia/Makassar - "PH", //Z#297 Asia/Manila - "OM", //Z#298 Asia/Muscat - "CY", //Z#299 Asia/Nicosia - "RU", //Z#300 Asia/Novokuznetsk - "RU", //Z#301 Asia/Novosibirsk - "RU", //Z#302 Asia/Omsk - "KZ", //Z#303 Asia/Oral - "KH", //Z#304 Asia/Phnom_Penh - "ID", //Z#305 Asia/Pontianak - "KP", //Z#306 Asia/Pyongyang - "QA", //Z#307 Asia/Qatar - "KZ", //Z#308 Asia/Qostanay - "KZ", //Z#309 Asia/Qyzylorda - "MM", //Z#310 Asia/Rangoon - "SA", //Z#311 Asia/Riyadh - "VN", //Z#312 Asia/Saigon - "RU", //Z#313 Asia/Sakhalin - "UZ", //Z#314 Asia/Samarkand - "KR", //Z#315 Asia/Seoul - "CN", //Z#316 Asia/Shanghai - "SG", //Z#317 Asia/Singapore - "RU", //Z#318 Asia/Srednekolymsk - "TW", //Z#319 Asia/Taipei - "UZ", //Z#320 Asia/Tashkent - "GE", //Z#321 Asia/Tbilisi - "IR", //Z#322 Asia/Tehran - "IL", //Z#323 Asia/Tel_Aviv - "BT", //Z#324 Asia/Thimbu - "BT", //Z#325 Asia/Thimphu - "JP", //Z#326 Asia/Tokyo - "RU", //Z#327 Asia/Tomsk - "ID", //Z#328 Asia/Ujung_Pandang - "MN", //Z#329 Asia/Ulaanbaatar - "MN", //Z#330 Asia/Ulan_Bator - "CN", //Z#331 Asia/Urumqi - "RU", //Z#332 Asia/Ust-Nera - "LA", //Z#333 Asia/Vientiane - "RU", //Z#334 Asia/Vladivostok - "RU", //Z#335 Asia/Yakutsk - "MM", //Z#336 Asia/Yangon - "RU", //Z#337 Asia/Yekaterinburg - "AM", //Z#338 Asia/Yerevan - "PT", //Z#339 Atlantic/Azores - "BM", //Z#340 Atlantic/Bermuda - "ES", //Z#341 Atlantic/Canary - "CV", //Z#342 Atlantic/Cape_Verde - "FO", //Z#343 Atlantic/Faeroe - "FO", //Z#344 Atlantic/Faroe - "SJ", //Z#345 Atlantic/Jan_Mayen - "PT", //Z#346 Atlantic/Madeira - "IS", //Z#347 Atlantic/Reykjavik - "GS", //Z#348 Atlantic/South_Georgia - "SH", //Z#349 Atlantic/St_Helena - "FK", //Z#350 Atlantic/Stanley - "AU", //Z#351 Australia/ACT - "AU", //Z#352 Australia/Adelaide - "AU", //Z#353 Australia/Brisbane - "AU", //Z#354 Australia/Broken_Hill - "AU", //Z#355 Australia/Canberra - "AU", //Z#356 Australia/Currie - "AU", //Z#357 Australia/Darwin - "AU", //Z#358 Australia/Eucla - "AU", //Z#359 Australia/Hobart - "AU", //Z#360 Australia/LHI - "AU", //Z#361 Australia/Lindeman - "AU", //Z#362 Australia/Lord_Howe - "AU", //Z#363 Australia/Melbourne - "AU", //Z#364 Australia/NSW - "AU", //Z#365 Australia/North - "AU", //Z#366 Australia/Perth - "AU", //Z#367 Australia/Queensland - "AU", //Z#368 Australia/South - "AU", //Z#369 Australia/Sydney - "AU", //Z#370 Australia/Tasmania - "AU", //Z#371 Australia/Victoria - "AU", //Z#372 Australia/West - "AU", //Z#373 Australia/Yancowinna - "BR", //Z#374 BET - "BD", //Z#375 BST - "BR", //Z#376 Brazil/Acre - "BR", //Z#377 Brazil/DeNoronha - "BR", //Z#378 Brazil/East - "BR", //Z#379 Brazil/West - "MZ", //Z#380 CAT - "BE", //Z#381 CET - "CA", //Z#382 CNT - "US", //Z#383 CST - "US", //Z#384 CST6CDT - "CN", //Z#385 CTT - "CA", //Z#386 Canada/Atlantic - "CA", //Z#387 Canada/Central - "CA", //Z#388 Canada/East-Saskatchewan - "CA", //Z#389 Canada/Eastern - "CA", //Z#390 Canada/Mountain - "CA", //Z#391 Canada/Newfoundland - "CA", //Z#392 Canada/Pacific - "CA", //Z#393 Canada/Saskatchewan - "CA", //Z#394 Canada/Yukon - "CL", //Z#395 Chile/Continental - "CL", //Z#396 Chile/EasterIsland - "CU", //Z#397 Cuba - "KE", //Z#398 EAT - "FR", //Z#399 ECT - "GR", //Z#400 EET - "PA", //Z#401 EST - "US", //Z#402 EST5EDT - "EG", //Z#403 Egypt - "IE", //Z#404 Eire - "001",//Z#405 Etc/GMT - "001",//Z#406 Etc/GMT+0 - "001",//Z#407 Etc/GMT+1 - "001",//Z#408 Etc/GMT+10 - "001",//Z#409 Etc/GMT+11 - "001",//Z#410 Etc/GMT+12 - "001",//Z#411 Etc/GMT+2 - "001",//Z#412 Etc/GMT+3 - "001",//Z#413 Etc/GMT+4 - "001",//Z#414 Etc/GMT+5 - "001",//Z#415 Etc/GMT+6 - "001",//Z#416 Etc/GMT+7 - "001",//Z#417 Etc/GMT+8 - "001",//Z#418 Etc/GMT+9 - "001",//Z#419 Etc/GMT-0 - "001",//Z#420 Etc/GMT-1 - "001",//Z#421 Etc/GMT-10 - "001",//Z#422 Etc/GMT-11 - "001",//Z#423 Etc/GMT-12 - "001",//Z#424 Etc/GMT-13 - "001",//Z#425 Etc/GMT-14 - "001",//Z#426 Etc/GMT-2 - "001",//Z#427 Etc/GMT-3 - "001",//Z#428 Etc/GMT-4 - "001",//Z#429 Etc/GMT-5 - "001",//Z#430 Etc/GMT-6 - "001",//Z#431 Etc/GMT-7 - "001",//Z#432 Etc/GMT-8 - "001",//Z#433 Etc/GMT-9 - "001",//Z#434 Etc/GMT0 - "001",//Z#435 Etc/Greenwich - "001",//Z#436 Etc/UCT - "001",//Z#437 Etc/UTC - "001",//Z#438 Etc/Universal - "001",//Z#439 Etc/Unknown - "001",//Z#440 Etc/Zulu - "NL", //Z#441 Europe/Amsterdam - "AD", //Z#442 Europe/Andorra - "RU", //Z#443 Europe/Astrakhan - "GR", //Z#444 Europe/Athens - "GB", //Z#445 Europe/Belfast - "RS", //Z#446 Europe/Belgrade - "DE", //Z#447 Europe/Berlin - "SK", //Z#448 Europe/Bratislava - "BE", //Z#449 Europe/Brussels - "RO", //Z#450 Europe/Bucharest - "HU", //Z#451 Europe/Budapest - "DE", //Z#452 Europe/Busingen - "MD", //Z#453 Europe/Chisinau - "DK", //Z#454 Europe/Copenhagen - "IE", //Z#455 Europe/Dublin - "GI", //Z#456 Europe/Gibraltar - "GG", //Z#457 Europe/Guernsey - "FI", //Z#458 Europe/Helsinki - "IM", //Z#459 Europe/Isle_of_Man - "TR", //Z#460 Europe/Istanbul - "JE", //Z#461 Europe/Jersey - "RU", //Z#462 Europe/Kaliningrad - "UA", //Z#463 Europe/Kiev - "RU", //Z#464 Europe/Kirov - "UA", //Z#465 Europe/Kyiv - "PT", //Z#466 Europe/Lisbon - "SI", //Z#467 Europe/Ljubljana - "GB", //Z#468 Europe/London - "LU", //Z#469 Europe/Luxembourg - "ES", //Z#470 Europe/Madrid - "MT", //Z#471 Europe/Malta - "AX", //Z#472 Europe/Mariehamn - "BY", //Z#473 Europe/Minsk - "MC", //Z#474 Europe/Monaco - "RU", //Z#475 Europe/Moscow - "CY", //Z#476 Europe/Nicosia - "NO", //Z#477 Europe/Oslo - "FR", //Z#478 Europe/Paris - "ME", //Z#479 Europe/Podgorica - "CZ", //Z#480 Europe/Prague - "LV", //Z#481 Europe/Riga - "IT", //Z#482 Europe/Rome - "RU", //Z#483 Europe/Samara - "SM", //Z#484 Europe/San_Marino - "BA", //Z#485 Europe/Sarajevo - "RU", //Z#486 Europe/Saratov - "UA", //Z#487 Europe/Simferopol - "MK", //Z#488 Europe/Skopje - "BG", //Z#489 Europe/Sofia - "SE", //Z#490 Europe/Stockholm - "EE", //Z#491 Europe/Tallinn - "AL", //Z#492 Europe/Tirane - "MD", //Z#493 Europe/Tiraspol - "RU", //Z#494 Europe/Ulyanovsk - "UA", //Z#495 Europe/Uzhgorod - "LI", //Z#496 Europe/Vaduz - "VA", //Z#497 Europe/Vatican - "AT", //Z#498 Europe/Vienna - "LT", //Z#499 Europe/Vilnius - "RU", //Z#500 Europe/Volgograd - "PL", //Z#501 Europe/Warsaw - "HR", //Z#502 Europe/Zagreb - "UA", //Z#503 Europe/Zaporozhye - "CH", //Z#504 Europe/Zurich - "001",//Z#505 Factory - "GB", //Z#506 GB - "GB", //Z#507 GB-Eire - "001",//Z#508 GMT - "001",//Z#509 GMT+0 - "001",//Z#510 GMT-0 - "001",//Z#511 GMT0 - "001",//Z#512 Greenwich - "US", //Z#513 HST - "HK", //Z#514 Hongkong - "US", //Z#515 IET - "IN", //Z#516 IST - "CI", //Z#517 Iceland - "MG", //Z#518 Indian/Antananarivo - "IO", //Z#519 Indian/Chagos - "CX", //Z#520 Indian/Christmas - "CC", //Z#521 Indian/Cocos - "KM", //Z#522 Indian/Comoro - "TF", //Z#523 Indian/Kerguelen - "SC", //Z#524 Indian/Mahe - "MV", //Z#525 Indian/Maldives - "MU", //Z#526 Indian/Mauritius - "YT", //Z#527 Indian/Mayotte - "RE", //Z#528 Indian/Reunion - "IR", //Z#529 Iran - "IL", //Z#530 Israel - "JP", //Z#531 JST - "JM", //Z#532 Jamaica - "JP", //Z#533 Japan - "MH", //Z#534 Kwajalein - "LY", //Z#535 Libya - "BE", //Z#536 MET - "WS", //Z#537 MIT - "US", //Z#538 MST - "US", //Z#539 MST7MDT - "MX", //Z#540 Mexico/BajaNorte - "MX", //Z#541 Mexico/BajaSur - "MX", //Z#542 Mexico/General - "AM", //Z#543 NET - "NZ", //Z#544 NST - "NZ", //Z#545 NZ - "NZ", //Z#546 NZ-CHAT - "US", //Z#547 Navajo - "PK", //Z#548 PLT - "US", //Z#549 PNT - "CN", //Z#550 PRC - "PR", //Z#551 PRT - "US", //Z#552 PST - "US", //Z#553 PST8PDT - "WS", //Z#554 Pacific/Apia - "NZ", //Z#555 Pacific/Auckland - "PG", //Z#556 Pacific/Bougainville - "NZ", //Z#557 Pacific/Chatham - "FM", //Z#558 Pacific/Chuuk - "CL", //Z#559 Pacific/Easter - "VU", //Z#560 Pacific/Efate - "KI", //Z#561 Pacific/Enderbury - "TK", //Z#562 Pacific/Fakaofo - "FJ", //Z#563 Pacific/Fiji - "TV", //Z#564 Pacific/Funafuti - "EC", //Z#565 Pacific/Galapagos - "PF", //Z#566 Pacific/Gambier - "SB", //Z#567 Pacific/Guadalcanal - "GU", //Z#568 Pacific/Guam - "US", //Z#569 Pacific/Honolulu - "UM", //Z#570 Pacific/Johnston - "KI", //Z#571 Pacific/Kanton - "KI", //Z#572 Pacific/Kiritimati - "FM", //Z#573 Pacific/Kosrae - "MH", //Z#574 Pacific/Kwajalein - "MH", //Z#575 Pacific/Majuro - "PF", //Z#576 Pacific/Marquesas - "UM", //Z#577 Pacific/Midway - "NR", //Z#578 Pacific/Nauru - "NU", //Z#579 Pacific/Niue - "NF", //Z#580 Pacific/Norfolk - "NC", //Z#581 Pacific/Noumea - "AS", //Z#582 Pacific/Pago_Pago - "PW", //Z#583 Pacific/Palau - "PN", //Z#584 Pacific/Pitcairn - "FM", //Z#585 Pacific/Pohnpei - "FM", //Z#586 Pacific/Ponape - "PG", //Z#587 Pacific/Port_Moresby - "CK", //Z#588 Pacific/Rarotonga - "MP", //Z#589 Pacific/Saipan - "AS", //Z#590 Pacific/Samoa - "PF", //Z#591 Pacific/Tahiti - "KI", //Z#592 Pacific/Tarawa - "TO", //Z#593 Pacific/Tongatapu - "FM", //Z#594 Pacific/Truk - "UM", //Z#595 Pacific/Wake - "WF", //Z#596 Pacific/Wallis - "FM", //Z#597 Pacific/Yap - "PL", //Z#598 Poland - "PT", //Z#599 Portugal - "TW", //Z#600 ROC - "KR", //Z#601 ROK - "SB", //Z#602 SST - "SG", //Z#603 Singapore - "001",//Z#604 SystemV/AST4 - "001",//Z#605 SystemV/AST4ADT - "001",//Z#606 SystemV/CST6 - "001",//Z#607 SystemV/CST6CDT - "001",//Z#608 SystemV/EST5 - "001",//Z#609 SystemV/EST5EDT - "001",//Z#610 SystemV/HST10 - "001",//Z#611 SystemV/MST7 - "001",//Z#612 SystemV/MST7MDT - "001",//Z#613 SystemV/PST8 - "001",//Z#614 SystemV/PST8PDT - "001",//Z#615 SystemV/YST9 - "001",//Z#616 SystemV/YST9YDT - "TR", //Z#617 Turkey - "001",//Z#618 UCT - "US", //Z#619 US/Alaska - "US", //Z#620 US/Aleutian - "US", //Z#621 US/Arizona - "US", //Z#622 US/Central - "US", //Z#623 US/East-Indiana - "US", //Z#624 US/Eastern - "US", //Z#625 US/Hawaii - "US", //Z#626 US/Indiana-Starke - "US", //Z#627 US/Michigan - "US", //Z#628 US/Mountain - "US", //Z#629 US/Pacific - "US", //Z#630 US/Pacific-New - "AS", //Z#631 US/Samoa - "001",//Z#632 UTC - "001",//Z#633 Universal - "VN", //Z#634 VST - "RU", //Z#635 W-SU - "PT", //Z#636 WET - "001",//Z#637 Zulu + "CL", //Z#104 America/Coyhaique + "CA", //Z#105 America/Creston + "BR", //Z#106 America/Cuiaba + "CW", //Z#107 America/Curacao + "GL", //Z#108 America/Danmarkshavn + "CA", //Z#109 America/Dawson + "CA", //Z#110 America/Dawson_Creek + "US", //Z#111 America/Denver + "US", //Z#112 America/Detroit + "DM", //Z#113 America/Dominica + "CA", //Z#114 America/Edmonton + "BR", //Z#115 America/Eirunepe + "SV", //Z#116 America/El_Salvador + "MX", //Z#117 America/Ensenada + "CA", //Z#118 America/Fort_Nelson + "US", //Z#119 America/Fort_Wayne + "BR", //Z#120 America/Fortaleza + "CA", //Z#121 America/Glace_Bay + "GL", //Z#122 America/Godthab + "CA", //Z#123 America/Goose_Bay + "TC", //Z#124 America/Grand_Turk + "GD", //Z#125 America/Grenada + "GP", //Z#126 America/Guadeloupe + "GT", //Z#127 America/Guatemala + "EC", //Z#128 America/Guayaquil + "GY", //Z#129 America/Guyana + "CA", //Z#130 America/Halifax + "CU", //Z#131 America/Havana + "MX", //Z#132 America/Hermosillo + "US", //Z#133 America/Indiana/Indianapolis + "US", //Z#134 America/Indiana/Knox + "US", //Z#135 America/Indiana/Marengo + "US", //Z#136 America/Indiana/Petersburg + "US", //Z#137 America/Indiana/Tell_City + "US", //Z#138 America/Indiana/Vevay + "US", //Z#139 America/Indiana/Vincennes + "US", //Z#140 America/Indiana/Winamac + "US", //Z#141 America/Indianapolis + "CA", //Z#142 America/Inuvik + "CA", //Z#143 America/Iqaluit + "JM", //Z#144 America/Jamaica + "AR", //Z#145 America/Jujuy + "US", //Z#146 America/Juneau + "US", //Z#147 America/Kentucky/Louisville + "US", //Z#148 America/Kentucky/Monticello + "US", //Z#149 America/Knox_IN + "BQ", //Z#150 America/Kralendijk + "BO", //Z#151 America/La_Paz + "PE", //Z#152 America/Lima + "US", //Z#153 America/Los_Angeles + "US", //Z#154 America/Louisville + "SX", //Z#155 America/Lower_Princes + "BR", //Z#156 America/Maceio + "NI", //Z#157 America/Managua + "BR", //Z#158 America/Manaus + "MF", //Z#159 America/Marigot + "MQ", //Z#160 America/Martinique + "MX", //Z#161 America/Matamoros + "MX", //Z#162 America/Mazatlan + "AR", //Z#163 America/Mendoza + "US", //Z#164 America/Menominee + "MX", //Z#165 America/Merida + "US", //Z#166 America/Metlakatla + "MX", //Z#167 America/Mexico_City + "PM", //Z#168 America/Miquelon + "CA", //Z#169 America/Moncton + "MX", //Z#170 America/Monterrey + "UY", //Z#171 America/Montevideo + "CA", //Z#172 America/Montreal + "MS", //Z#173 America/Montserrat + "BS", //Z#174 America/Nassau + "US", //Z#175 America/New_York + "CA", //Z#176 America/Nipigon + "US", //Z#177 America/Nome + "BR", //Z#178 America/Noronha + "US", //Z#179 America/North_Dakota/Beulah + "US", //Z#180 America/North_Dakota/Center + "US", //Z#181 America/North_Dakota/New_Salem + "GL", //Z#182 America/Nuuk + "MX", //Z#183 America/Ojinaga + "PA", //Z#184 America/Panama + "CA", //Z#185 America/Pangnirtung + "SR", //Z#186 America/Paramaribo + "US", //Z#187 America/Phoenix + "HT", //Z#188 America/Port-au-Prince + "TT", //Z#189 America/Port_of_Spain + "BR", //Z#190 America/Porto_Acre + "BR", //Z#191 America/Porto_Velho + "PR", //Z#192 America/Puerto_Rico + "CL", //Z#193 America/Punta_Arenas + "CA", //Z#194 America/Rainy_River + "CA", //Z#195 America/Rankin_Inlet + "BR", //Z#196 America/Recife + "CA", //Z#197 America/Regina + "CA", //Z#198 America/Resolute + "BR", //Z#199 America/Rio_Branco + "AR", //Z#200 America/Rosario + "MX", //Z#201 America/Santa_Isabel + "BR", //Z#202 America/Santarem + "CL", //Z#203 America/Santiago + "DO", //Z#204 America/Santo_Domingo + "BR", //Z#205 America/Sao_Paulo + "GL", //Z#206 America/Scoresbysund + "US", //Z#207 America/Shiprock + "US", //Z#208 America/Sitka + "BL", //Z#209 America/St_Barthelemy + "CA", //Z#210 America/St_Johns + "KN", //Z#211 America/St_Kitts + "LC", //Z#212 America/St_Lucia + "VI", //Z#213 America/St_Thomas + "VC", //Z#214 America/St_Vincent + "CA", //Z#215 America/Swift_Current + "HN", //Z#216 America/Tegucigalpa + "GL", //Z#217 America/Thule + "CA", //Z#218 America/Thunder_Bay + "MX", //Z#219 America/Tijuana + "CA", //Z#220 America/Toronto + "VG", //Z#221 America/Tortola + "CA", //Z#222 America/Vancouver + "VI", //Z#223 America/Virgin + "CA", //Z#224 America/Whitehorse + "CA", //Z#225 America/Winnipeg + "US", //Z#226 America/Yakutat + "CA", //Z#227 America/Yellowknife + "AQ", //Z#228 Antarctica/Casey + "AQ", //Z#229 Antarctica/Davis + "AQ", //Z#230 Antarctica/DumontDUrville + "AU", //Z#231 Antarctica/Macquarie + "AQ", //Z#232 Antarctica/Mawson + "AQ", //Z#233 Antarctica/McMurdo + "AQ", //Z#234 Antarctica/Palmer + "AQ", //Z#235 Antarctica/Rothera + "AQ", //Z#236 Antarctica/South_Pole + "AQ", //Z#237 Antarctica/Syowa + "AQ", //Z#238 Antarctica/Troll + "AQ", //Z#239 Antarctica/Vostok + "SJ", //Z#240 Arctic/Longyearbyen + "YE", //Z#241 Asia/Aden + "KZ", //Z#242 Asia/Almaty + "JO", //Z#243 Asia/Amman + "RU", //Z#244 Asia/Anadyr + "KZ", //Z#245 Asia/Aqtau + "KZ", //Z#246 Asia/Aqtobe + "TM", //Z#247 Asia/Ashgabat + "TM", //Z#248 Asia/Ashkhabad + "KZ", //Z#249 Asia/Atyrau + "IQ", //Z#250 Asia/Baghdad + "BH", //Z#251 Asia/Bahrain + "AZ", //Z#252 Asia/Baku + "TH", //Z#253 Asia/Bangkok + "RU", //Z#254 Asia/Barnaul + "LB", //Z#255 Asia/Beirut + "KG", //Z#256 Asia/Bishkek + "BN", //Z#257 Asia/Brunei + "IN", //Z#258 Asia/Calcutta + "RU", //Z#259 Asia/Chita + "MN", //Z#260 Asia/Choibalsan + "CN", //Z#261 Asia/Chongqing + "CN", //Z#262 Asia/Chungking + "LK", //Z#263 Asia/Colombo + "BD", //Z#264 Asia/Dacca + "SY", //Z#265 Asia/Damascus + "BD", //Z#266 Asia/Dhaka + "TL", //Z#267 Asia/Dili + "AE", //Z#268 Asia/Dubai + "TJ", //Z#269 Asia/Dushanbe + "CY", //Z#270 Asia/Famagusta + "PS", //Z#271 Asia/Gaza + "CN", //Z#272 Asia/Harbin + "PS", //Z#273 Asia/Hebron + "VN", //Z#274 Asia/Ho_Chi_Minh + "HK", //Z#275 Asia/Hong_Kong + "MN", //Z#276 Asia/Hovd + "RU", //Z#277 Asia/Irkutsk + "TR", //Z#278 Asia/Istanbul + "ID", //Z#279 Asia/Jakarta + "ID", //Z#280 Asia/Jayapura + "IL", //Z#281 Asia/Jerusalem + "AF", //Z#282 Asia/Kabul + "RU", //Z#283 Asia/Kamchatka + "PK", //Z#284 Asia/Karachi + "CN", //Z#285 Asia/Kashgar + "NP", //Z#286 Asia/Kathmandu + "NP", //Z#287 Asia/Katmandu + "RU", //Z#288 Asia/Khandyga + "IN", //Z#289 Asia/Kolkata + "RU", //Z#290 Asia/Krasnoyarsk + "MY", //Z#291 Asia/Kuala_Lumpur + "MY", //Z#292 Asia/Kuching + "KW", //Z#293 Asia/Kuwait + "MO", //Z#294 Asia/Macao + "MO", //Z#295 Asia/Macau + "RU", //Z#296 Asia/Magadan + "ID", //Z#297 Asia/Makassar + "PH", //Z#298 Asia/Manila + "OM", //Z#299 Asia/Muscat + "CY", //Z#300 Asia/Nicosia + "RU", //Z#301 Asia/Novokuznetsk + "RU", //Z#302 Asia/Novosibirsk + "RU", //Z#303 Asia/Omsk + "KZ", //Z#304 Asia/Oral + "KH", //Z#305 Asia/Phnom_Penh + "ID", //Z#306 Asia/Pontianak + "KP", //Z#307 Asia/Pyongyang + "QA", //Z#308 Asia/Qatar + "KZ", //Z#309 Asia/Qostanay + "KZ", //Z#310 Asia/Qyzylorda + "MM", //Z#311 Asia/Rangoon + "SA", //Z#312 Asia/Riyadh + "VN", //Z#313 Asia/Saigon + "RU", //Z#314 Asia/Sakhalin + "UZ", //Z#315 Asia/Samarkand + "KR", //Z#316 Asia/Seoul + "CN", //Z#317 Asia/Shanghai + "SG", //Z#318 Asia/Singapore + "RU", //Z#319 Asia/Srednekolymsk + "TW", //Z#320 Asia/Taipei + "UZ", //Z#321 Asia/Tashkent + "GE", //Z#322 Asia/Tbilisi + "IR", //Z#323 Asia/Tehran + "IL", //Z#324 Asia/Tel_Aviv + "BT", //Z#325 Asia/Thimbu + "BT", //Z#326 Asia/Thimphu + "JP", //Z#327 Asia/Tokyo + "RU", //Z#328 Asia/Tomsk + "ID", //Z#329 Asia/Ujung_Pandang + "MN", //Z#330 Asia/Ulaanbaatar + "MN", //Z#331 Asia/Ulan_Bator + "CN", //Z#332 Asia/Urumqi + "RU", //Z#333 Asia/Ust-Nera + "LA", //Z#334 Asia/Vientiane + "RU", //Z#335 Asia/Vladivostok + "RU", //Z#336 Asia/Yakutsk + "MM", //Z#337 Asia/Yangon + "RU", //Z#338 Asia/Yekaterinburg + "AM", //Z#339 Asia/Yerevan + "PT", //Z#340 Atlantic/Azores + "BM", //Z#341 Atlantic/Bermuda + "ES", //Z#342 Atlantic/Canary + "CV", //Z#343 Atlantic/Cape_Verde + "FO", //Z#344 Atlantic/Faeroe + "FO", //Z#345 Atlantic/Faroe + "SJ", //Z#346 Atlantic/Jan_Mayen + "PT", //Z#347 Atlantic/Madeira + "IS", //Z#348 Atlantic/Reykjavik + "GS", //Z#349 Atlantic/South_Georgia + "SH", //Z#350 Atlantic/St_Helena + "FK", //Z#351 Atlantic/Stanley + "AU", //Z#352 Australia/ACT + "AU", //Z#353 Australia/Adelaide + "AU", //Z#354 Australia/Brisbane + "AU", //Z#355 Australia/Broken_Hill + "AU", //Z#356 Australia/Canberra + "AU", //Z#357 Australia/Currie + "AU", //Z#358 Australia/Darwin + "AU", //Z#359 Australia/Eucla + "AU", //Z#360 Australia/Hobart + "AU", //Z#361 Australia/LHI + "AU", //Z#362 Australia/Lindeman + "AU", //Z#363 Australia/Lord_Howe + "AU", //Z#364 Australia/Melbourne + "AU", //Z#365 Australia/NSW + "AU", //Z#366 Australia/North + "AU", //Z#367 Australia/Perth + "AU", //Z#368 Australia/Queensland + "AU", //Z#369 Australia/South + "AU", //Z#370 Australia/Sydney + "AU", //Z#371 Australia/Tasmania + "AU", //Z#372 Australia/Victoria + "AU", //Z#373 Australia/West + "AU", //Z#374 Australia/Yancowinna + "BR", //Z#375 BET + "BD", //Z#376 BST + "BR", //Z#377 Brazil/Acre + "BR", //Z#378 Brazil/DeNoronha + "BR", //Z#379 Brazil/East + "BR", //Z#380 Brazil/West + "MZ", //Z#381 CAT + "BE", //Z#382 CET + "CA", //Z#383 CNT + "US", //Z#384 CST + "US", //Z#385 CST6CDT + "CN", //Z#386 CTT + "CA", //Z#387 Canada/Atlantic + "CA", //Z#388 Canada/Central + "CA", //Z#389 Canada/East-Saskatchewan + "CA", //Z#390 Canada/Eastern + "CA", //Z#391 Canada/Mountain + "CA", //Z#392 Canada/Newfoundland + "CA", //Z#393 Canada/Pacific + "CA", //Z#394 Canada/Saskatchewan + "CA", //Z#395 Canada/Yukon + "CL", //Z#396 Chile/Continental + "CL", //Z#397 Chile/EasterIsland + "CU", //Z#398 Cuba + "KE", //Z#399 EAT + "FR", //Z#400 ECT + "GR", //Z#401 EET + "PA", //Z#402 EST + "US", //Z#403 EST5EDT + "EG", //Z#404 Egypt + "IE", //Z#405 Eire + "001",//Z#406 Etc/GMT + "001",//Z#407 Etc/GMT+0 + "001",//Z#408 Etc/GMT+1 + "001",//Z#409 Etc/GMT+10 + "001",//Z#410 Etc/GMT+11 + "001",//Z#411 Etc/GMT+12 + "001",//Z#412 Etc/GMT+2 + "001",//Z#413 Etc/GMT+3 + "001",//Z#414 Etc/GMT+4 + "001",//Z#415 Etc/GMT+5 + "001",//Z#416 Etc/GMT+6 + "001",//Z#417 Etc/GMT+7 + "001",//Z#418 Etc/GMT+8 + "001",//Z#419 Etc/GMT+9 + "001",//Z#420 Etc/GMT-0 + "001",//Z#421 Etc/GMT-1 + "001",//Z#422 Etc/GMT-10 + "001",//Z#423 Etc/GMT-11 + "001",//Z#424 Etc/GMT-12 + "001",//Z#425 Etc/GMT-13 + "001",//Z#426 Etc/GMT-14 + "001",//Z#427 Etc/GMT-2 + "001",//Z#428 Etc/GMT-3 + "001",//Z#429 Etc/GMT-4 + "001",//Z#430 Etc/GMT-5 + "001",//Z#431 Etc/GMT-6 + "001",//Z#432 Etc/GMT-7 + "001",//Z#433 Etc/GMT-8 + "001",//Z#434 Etc/GMT-9 + "001",//Z#435 Etc/GMT0 + "001",//Z#436 Etc/Greenwich + "001",//Z#437 Etc/UCT + "001",//Z#438 Etc/UTC + "001",//Z#439 Etc/Universal + "001",//Z#440 Etc/Unknown + "001",//Z#441 Etc/Zulu + "NL", //Z#442 Europe/Amsterdam + "AD", //Z#443 Europe/Andorra + "RU", //Z#444 Europe/Astrakhan + "GR", //Z#445 Europe/Athens + "GB", //Z#446 Europe/Belfast + "RS", //Z#447 Europe/Belgrade + "DE", //Z#448 Europe/Berlin + "SK", //Z#449 Europe/Bratislava + "BE", //Z#450 Europe/Brussels + "RO", //Z#451 Europe/Bucharest + "HU", //Z#452 Europe/Budapest + "DE", //Z#453 Europe/Busingen + "MD", //Z#454 Europe/Chisinau + "DK", //Z#455 Europe/Copenhagen + "IE", //Z#456 Europe/Dublin + "GI", //Z#457 Europe/Gibraltar + "GG", //Z#458 Europe/Guernsey + "FI", //Z#459 Europe/Helsinki + "IM", //Z#460 Europe/Isle_of_Man + "TR", //Z#461 Europe/Istanbul + "JE", //Z#462 Europe/Jersey + "RU", //Z#463 Europe/Kaliningrad + "UA", //Z#464 Europe/Kiev + "RU", //Z#465 Europe/Kirov + "UA", //Z#466 Europe/Kyiv + "PT", //Z#467 Europe/Lisbon + "SI", //Z#468 Europe/Ljubljana + "GB", //Z#469 Europe/London + "LU", //Z#470 Europe/Luxembourg + "ES", //Z#471 Europe/Madrid + "MT", //Z#472 Europe/Malta + "AX", //Z#473 Europe/Mariehamn + "BY", //Z#474 Europe/Minsk + "MC", //Z#475 Europe/Monaco + "RU", //Z#476 Europe/Moscow + "CY", //Z#477 Europe/Nicosia + "NO", //Z#478 Europe/Oslo + "FR", //Z#479 Europe/Paris + "ME", //Z#480 Europe/Podgorica + "CZ", //Z#481 Europe/Prague + "LV", //Z#482 Europe/Riga + "IT", //Z#483 Europe/Rome + "RU", //Z#484 Europe/Samara + "SM", //Z#485 Europe/San_Marino + "BA", //Z#486 Europe/Sarajevo + "RU", //Z#487 Europe/Saratov + "UA", //Z#488 Europe/Simferopol + "MK", //Z#489 Europe/Skopje + "BG", //Z#490 Europe/Sofia + "SE", //Z#491 Europe/Stockholm + "EE", //Z#492 Europe/Tallinn + "AL", //Z#493 Europe/Tirane + "MD", //Z#494 Europe/Tiraspol + "RU", //Z#495 Europe/Ulyanovsk + "UA", //Z#496 Europe/Uzhgorod + "LI", //Z#497 Europe/Vaduz + "VA", //Z#498 Europe/Vatican + "AT", //Z#499 Europe/Vienna + "LT", //Z#500 Europe/Vilnius + "RU", //Z#501 Europe/Volgograd + "PL", //Z#502 Europe/Warsaw + "HR", //Z#503 Europe/Zagreb + "UA", //Z#504 Europe/Zaporozhye + "CH", //Z#505 Europe/Zurich + "001",//Z#506 Factory + "GB", //Z#507 GB + "GB", //Z#508 GB-Eire + "001",//Z#509 GMT + "001",//Z#510 GMT+0 + "001",//Z#511 GMT-0 + "001",//Z#512 GMT0 + "001",//Z#513 Greenwich + "US", //Z#514 HST + "HK", //Z#515 Hongkong + "US", //Z#516 IET + "IN", //Z#517 IST + "CI", //Z#518 Iceland + "MG", //Z#519 Indian/Antananarivo + "IO", //Z#520 Indian/Chagos + "CX", //Z#521 Indian/Christmas + "CC", //Z#522 Indian/Cocos + "KM", //Z#523 Indian/Comoro + "TF", //Z#524 Indian/Kerguelen + "SC", //Z#525 Indian/Mahe + "MV", //Z#526 Indian/Maldives + "MU", //Z#527 Indian/Mauritius + "YT", //Z#528 Indian/Mayotte + "RE", //Z#529 Indian/Reunion + "IR", //Z#530 Iran + "IL", //Z#531 Israel + "JP", //Z#532 JST + "JM", //Z#533 Jamaica + "JP", //Z#534 Japan + "MH", //Z#535 Kwajalein + "LY", //Z#536 Libya + "BE", //Z#537 MET + "WS", //Z#538 MIT + "US", //Z#539 MST + "US", //Z#540 MST7MDT + "MX", //Z#541 Mexico/BajaNorte + "MX", //Z#542 Mexico/BajaSur + "MX", //Z#543 Mexico/General + "AM", //Z#544 NET + "NZ", //Z#545 NST + "NZ", //Z#546 NZ + "NZ", //Z#547 NZ-CHAT + "US", //Z#548 Navajo + "PK", //Z#549 PLT + "US", //Z#550 PNT + "CN", //Z#551 PRC + "PR", //Z#552 PRT + "US", //Z#553 PST + "US", //Z#554 PST8PDT + "WS", //Z#555 Pacific/Apia + "NZ", //Z#556 Pacific/Auckland + "PG", //Z#557 Pacific/Bougainville + "NZ", //Z#558 Pacific/Chatham + "FM", //Z#559 Pacific/Chuuk + "CL", //Z#560 Pacific/Easter + "VU", //Z#561 Pacific/Efate + "KI", //Z#562 Pacific/Enderbury + "TK", //Z#563 Pacific/Fakaofo + "FJ", //Z#564 Pacific/Fiji + "TV", //Z#565 Pacific/Funafuti + "EC", //Z#566 Pacific/Galapagos + "PF", //Z#567 Pacific/Gambier + "SB", //Z#568 Pacific/Guadalcanal + "GU", //Z#569 Pacific/Guam + "US", //Z#570 Pacific/Honolulu + "UM", //Z#571 Pacific/Johnston + "KI", //Z#572 Pacific/Kanton + "KI", //Z#573 Pacific/Kiritimati + "FM", //Z#574 Pacific/Kosrae + "MH", //Z#575 Pacific/Kwajalein + "MH", //Z#576 Pacific/Majuro + "PF", //Z#577 Pacific/Marquesas + "UM", //Z#578 Pacific/Midway + "NR", //Z#579 Pacific/Nauru + "NU", //Z#580 Pacific/Niue + "NF", //Z#581 Pacific/Norfolk + "NC", //Z#582 Pacific/Noumea + "AS", //Z#583 Pacific/Pago_Pago + "PW", //Z#584 Pacific/Palau + "PN", //Z#585 Pacific/Pitcairn + "FM", //Z#586 Pacific/Pohnpei + "FM", //Z#587 Pacific/Ponape + "PG", //Z#588 Pacific/Port_Moresby + "CK", //Z#589 Pacific/Rarotonga + "MP", //Z#590 Pacific/Saipan + "AS", //Z#591 Pacific/Samoa + "PF", //Z#592 Pacific/Tahiti + "KI", //Z#593 Pacific/Tarawa + "TO", //Z#594 Pacific/Tongatapu + "FM", //Z#595 Pacific/Truk + "UM", //Z#596 Pacific/Wake + "WF", //Z#597 Pacific/Wallis + "FM", //Z#598 Pacific/Yap + "PL", //Z#599 Poland + "PT", //Z#600 Portugal + "TW", //Z#601 ROC + "KR", //Z#602 ROK + "SB", //Z#603 SST + "SG", //Z#604 Singapore + "001",//Z#605 SystemV/AST4 + "001",//Z#606 SystemV/AST4ADT + "001",//Z#607 SystemV/CST6 + "001",//Z#608 SystemV/CST6CDT + "001",//Z#609 SystemV/EST5 + "001",//Z#610 SystemV/EST5EDT + "001",//Z#611 SystemV/HST10 + "001",//Z#612 SystemV/MST7 + "001",//Z#613 SystemV/MST7MDT + "001",//Z#614 SystemV/PST8 + "001",//Z#615 SystemV/PST8PDT + "001",//Z#616 SystemV/YST9 + "001",//Z#617 SystemV/YST9YDT + "TR", //Z#618 Turkey + "001",//Z#619 UCT + "US", //Z#620 US/Alaska + "US", //Z#621 US/Aleutian + "US", //Z#622 US/Arizona + "US", //Z#623 US/Central + "US", //Z#624 US/East-Indiana + "US", //Z#625 US/Eastern + "US", //Z#626 US/Hawaii + "US", //Z#627 US/Indiana-Starke + "US", //Z#628 US/Michigan + "US", //Z#629 US/Mountain + "US", //Z#630 US/Pacific + "US", //Z#631 US/Pacific-New + "AS", //Z#632 US/Samoa + "001",//Z#633 UTC + "001",//Z#634 Universal + "VN", //Z#635 VST + "RU", //Z#636 W-SU + "PT", //Z#637 WET + "001",//Z#638 Zulu } } diff --git a/js/moz.configure b/js/moz.configure index bb00e1acb53..eb4b274105b 100644 --- a/js/moz.configure +++ b/js/moz.configure @@ -1285,6 +1285,30 @@ set_define( depends_if("--enable-wasm-type-reflections")(lambda x: True), ) +# Support for resizable ArrayBuffer in Wasm +# ========================================= + + +@depends(milestone.is_nightly) +def default_wasm_resizable_arraybuffer(is_nightly): + return is_nightly + + +option( + "--enable-wasm-resizable-arraybuffer", + default=default_wasm_resizable_arraybuffer, + help="{Enable|Disable} resizable ArrayBuffer in WASM", +) + +set_config( + "ENABLE_WASM_RESIZABLE_ARRAYBUFFER", + depends_if("--enable-wasm-resizable-arraybuffer")(lambda x: True), +) +set_define( + "ENABLE_WASM_RESIZABLE_ARRAYBUFFER", + depends_if("--enable-wasm-resizable-arraybuffer")(lambda x: True), +) + # Wasi configuration # =================================================== diff --git a/js/public/HeapAPI.h b/js/public/HeapAPI.h index 4a3f087ac73..e712e3481ed 100644 --- a/js/public/HeapAPI.h +++ b/js/public/HeapAPI.h @@ -85,7 +85,6 @@ enum class ChunkKind : uint8_t { Invalid = 0, TenuredArenas, MediumBuffers, - LargeBuffer, NurseryToSpace, NurseryFromSpace }; @@ -138,8 +137,7 @@ class ChunkBase { } bool isTenuredChunk() const { - return kind == ChunkKind::TenuredArenas || - kind == ChunkKind::MediumBuffers || kind == ChunkKind::LargeBuffer; + return kind == ChunkKind::TenuredArenas || kind == ChunkKind::MediumBuffers; } // The store buffer for pointers from tenured things to things in this @@ -332,7 +330,6 @@ class ArenaChunkBase : public ChunkBase { ArenaChunkInfo info; ChunkMarkBitmap markBits; ChunkArenaBitmap freeCommittedArenas; - ChunkArenaBitmap pendingFreeCommittedArenas; ChunkPageBitmap decommittedPages; protected: diff --git a/js/public/friend/ErrorNumbers.msg b/js/public/friend/ErrorNumbers.msg index db9b266ee77..7c542bf699a 100644 --- a/js/public/friend/ErrorNumbers.msg +++ b/js/public/friend/ErrorNumbers.msg @@ -505,6 +505,9 @@ MSG_DEF(JSMSG_WASM_NONSHARED_WAIT, 0, JSEXN_WASMRUNTIMEERROR, "atomic wait o MSG_DEF(JSMSG_WASM_SUPPLY_ONLY_ONE, 2, JSEXN_TYPEERR, "exactly one of {0} and {1} must be supplied") MSG_DEF(JSMSG_WASM_MISSING_REQUIRED, 1, JSEXN_TYPEERR, "Missing required argument {0}") MSG_DEF(JSMSG_WASM_MODIFIED_GC_OBJECT, 0, JSEXN_TYPEERR, "can't modify WebAssembly GC objects") +MSG_DEF(JSMSG_WASM_ARRAYBUFFER_PAGE_MULTIPLE, 0, JSEXN_RANGEERR, "can only grow by WebAssembly page multiples") +MSG_DEF(JSMSG_WASM_ARRAYBUFFER_CANNOT_SHRINK, 0, JSEXN_RANGEERR, "cannot shrink WebAssembly memory") +MSG_DEF(JSMSG_WASM_MEMORY_NOT_RESIZABLE, 0, JSEXN_TYPEERR, "WebAssembly memory non-resizable, maximum length is not provided") // JSPI MSG_DEF(JSMSG_JSPI_ARG_POSITION, 0, JSEXN_TYPEERR, "Invalid argument position value") diff --git a/js/src/aclocal.m4 b/js/src/aclocal.m4 new file mode 100644 index 00000000000..4151cbd8878 --- /dev/null +++ b/js/src/aclocal.m4 @@ -0,0 +1,23 @@ +dnl +dnl Local autoconf macros used with mozilla +dnl The contents of this file are under the Public Domain. +dnl + +builtin(include, ../../build/autoconf/hooks.m4)dnl +builtin(include, ../../build/autoconf/config.status.m4)dnl +builtin(include, ../../build/autoconf/altoptions.m4)dnl + +define([__MOZ_AC_INIT_PREPARE], defn([AC_INIT_PREPARE])) +define([AC_INIT_PREPARE], +[if test -z "$srcdir"; then + srcdir=`dirname "[$]0"` +fi +srcdir="$srcdir/../.." +__MOZ_AC_INIT_PREPARE($1) +]) + +dnl This won't actually read the mozconfig, but data that configure.py +dnl will have placed for us to read. Configure.py takes care of not reading +dnl the mozconfig where appropriate but can still give us some variables +dnl to read. +MOZ_READ_MOZCONFIG(.) diff --git a/js/src/build/moz.build b/js/src/build/moz.build index 0a08b233e15..f40adc434ec 100644 --- a/js/src/build/moz.build +++ b/js/src/build/moz.build @@ -26,7 +26,7 @@ LIBRARY_DEFINES["MOZ_SUPPORT_LEAKCHECKING"] = True # JS shell would like to link to the static library. if CONFIG["JS_SHARED_LIBRARY"]: - GeckoSharedLibrary("js", linkage=None) + GeckoSharedLibrary("js") SHARED_LIBRARY_NAME = CONFIG["JS_LIBRARY_NAME"] # Ensure symbol versions of shared library on Linux do not conflict diff --git a/js/src/builtin/intl/TimeZoneDataGenerated.h b/js/src/builtin/intl/TimeZoneDataGenerated.h index f36ccc82940..3052f86e80f 100644 --- a/js/src/builtin/intl/TimeZoneDataGenerated.h +++ b/js/src/builtin/intl/TimeZoneDataGenerated.h @@ -1,5 +1,5 @@ // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a +// tzdata version = 2025b #ifndef builtin_intl_TimeZoneDataGenerated_h #define builtin_intl_TimeZoneDataGenerated_h @@ -54,7 +54,6 @@ const LinkAndTarget ianaLinksCanonicalizedDifferentlyByICU[] = { { "America/Louisville", "America/Kentucky/Louisville" }, // America/Louisville [backward] { "America/Mendoza", "America/Argentina/Mendoza" }, // America/Mendoza [backward] { "America/Rosario", "America/Argentina/Cordoba" }, // America/Cordoba [backward] - { "Antarctica/South_Pole", "Antarctica/McMurdo" }, // Pacific/Auckland [backward] { "Asia/Calcutta", "Asia/Kolkata" }, // Asia/Calcutta [backward] { "Asia/Katmandu", "Asia/Kathmandu" }, // Asia/Katmandu [backward] { "Asia/Rangoon", "Asia/Yangon" }, // Asia/Rangoon [backward] diff --git a/js/src/configure b/js/src/configure index db41b0e5b10..e2c672e40d1 100755 --- a/js/src/configure +++ b/js/src/configure @@ -6,6 +6,7 @@ SRCDIR=$(dirname $0) TOPSRCDIR="$SRCDIR"/../.. PYTHON3="${PYTHON3:-python3}" +export OLD_CONFIGURE="$SRCDIR"/old-configure set -- "$@" --enable-project=js diff --git a/js/src/devtools/rootAnalysis/mozconfig.common b/js/src/devtools/rootAnalysis/mozconfig.common index 3be4036ada8..c68fb6a26cc 100644 --- a/js/src/devtools/rootAnalysis/mozconfig.common +++ b/js/src/devtools/rootAnalysis/mozconfig.common @@ -32,6 +32,6 @@ ac_add_options --disable-replace-malloc # -Wignored-attributes is very verbose due to attributes being # ignored on template parameters. ANALYSIS_EXTRA_CFLAGS="-Wno-attributes -Wno-ignored-attributes" -export CFLAGS="$CFLAGS $ANALYSIS_EXTRA_CFLAGS" -export CPPFLAGS="$CPPFLAGS $ANALYSIS_EXTRA_CFLAGS" -export CXXFLAGS="$CXXFLAGS $ANALYSIS_EXTRA_CFLAGS" +CFLAGS="$CFLAGS $ANALYSIS_EXTRA_CFLAGS" +CPPFLAGS="$CPPFLAGS $ANALYSIS_EXTRA_CFLAGS" +CXXFLAGS="$CXXFLAGS $ANALYSIS_EXTRA_CFLAGS" diff --git a/js/src/gc/Allocator.h b/js/src/gc/Allocator.h index 6ee2907bc81..e9e2ba574fc 100644 --- a/js/src/gc/Allocator.h +++ b/js/src/gc/Allocator.h @@ -129,15 +129,17 @@ void FreeBuffer(JS::Zone* zone, void* alloc); // cell. Does not work for malloced memory. bool IsBufferAlloc(void* alloc); -bool IsNurseryOwned(void* alloc); +bool IsNurseryOwned(JS::Zone* zone, void* alloc); -size_t GetAllocSize(void* alloc); -JS::Zone* GetAllocZone(void* alloc); +size_t GetAllocSize(JS::Zone* zone, void* alloc); // Buffer allocator GC-internal API. void* AllocBufferInGC(JS::Zone* zone, size_t bytes, bool nurseryOwned); -bool IsBufferAllocMarkedBlack(void* alloc); +bool IsBufferAllocMarkedBlack(JS::Zone* zone, void* alloc); +void TraceBufferEdgeInternal(JSTracer* trc, Cell* owner, void** bufferp, + const char* name); +void MarkTenuredBuffer(JS::Zone* zone, void* alloc); } // namespace gc } // namespace js diff --git a/js/src/gc/BufferAllocator-inl.h b/js/src/gc/BufferAllocator-inl.h index b0dfbe458a3..66154ddabda 100644 --- a/js/src/gc/BufferAllocator-inl.h +++ b/js/src/gc/BufferAllocator-inl.h @@ -45,8 +45,7 @@ inline size_t BufferAllocator::GetGoodAllocSize(size_t requiredBytes) { requiredBytes = std::max(requiredBytes, MinAllocSize); if (IsLargeAllocSize(requiredBytes)) { - size_t headerSize = sizeof(LargeBuffer); - return RoundUp(requiredBytes + headerSize, ChunkSize) - headerSize; + return RoundUp(requiredBytes, ChunkSize); } // Small and medium headers have the same size. @@ -61,10 +60,8 @@ inline size_t BufferAllocator::GetGoodAllocSize(size_t requiredBytes) { size_t BufferAllocator::GetGoodPower2AllocSize(size_t requiredBytes) { requiredBytes = std::max(requiredBytes, MinAllocSize); - size_t headerSize; - if (IsLargeAllocSize(requiredBytes)) { - headerSize = sizeof(LargeBuffer); - } else { + size_t headerSize = 0; + if (!IsLargeAllocSize(requiredBytes)) { // Small and medium headers have the same size. headerSize = sizeof(SmallBuffer); static_assert(sizeof(SmallBuffer) == sizeof(MediumBuffer)); @@ -135,20 +132,26 @@ inline bool IsBufferAlloc(void* alloc) { return BufferAllocator::IsBufferAlloc(alloc); } -inline size_t GetAllocSize(void* alloc) { - return BufferAllocator::GetAllocSize(alloc); +inline size_t GetAllocSize(JS::Zone* zone, void* alloc) { + return zone->bufferAllocator.getAllocSize(alloc); } -inline JS::Zone* GetAllocZone(void* alloc) { - return BufferAllocator::GetAllocZone(alloc); +inline bool IsNurseryOwned(JS::Zone* zone, void* alloc) { + return zone->bufferAllocator.isNurseryOwned(alloc); } -inline bool IsNurseryOwned(void* alloc) { - return BufferAllocator::IsNurseryOwned(alloc); +inline bool IsBufferAllocMarkedBlack(JS::Zone* zone, void* alloc) { + return zone->bufferAllocator.isMarkedBlack(alloc); } -inline bool IsBufferAllocMarkedBlack(void* alloc) { - return BufferAllocator::IsMarkedBlack(alloc); +inline void TraceBufferEdgeInternal(JSTracer* trc, Cell* owner, void** bufferp, + const char* name) { + owner->zoneFromAnyThread()->bufferAllocator.traceEdge(trc, owner, bufferp, + name); +} + +inline void MarkTenuredBuffer(JS::Zone* zone, void* alloc) { + zone->bufferAllocator.markTenuredAlloc(alloc); } } // namespace js::gc diff --git a/js/src/gc/BufferAllocator.cpp b/js/src/gc/BufferAllocator.cpp index 20bed613889..107beaabe7c 100644 --- a/js/src/gc/BufferAllocator.cpp +++ b/js/src/gc/BufferAllocator.cpp @@ -21,12 +21,43 @@ #include "util/Poison.h" #include "gc/Heap-inl.h" +#include "gc/Marking-inl.h" using namespace js; using namespace js::gc; namespace js::gc { +struct alignas(CellAlignBytes) LargeBuffer + : public SlimLinkedListElement { + void* alloc; + size_t bytes; + bool isNurseryOwned; + bool allocatedDuringCollection = false; + +#ifdef DEBUG + uint32_t checkValue = LargeBufferCheckValue; +#endif + + LargeBuffer(void* ptr, size_t bytes, bool nurseryOwned) + : alloc(ptr), bytes(bytes), isNurseryOwned(nurseryOwned) { + MOZ_ASSERT((bytes % ChunkSize) == 0); + } + + inline void check() const; + + inline Cell* headerCell(); + +#ifdef DEBUG + inline Zone* zone(); + inline Zone* zoneFromAnyThread(); +#endif + + void* data() { return alloc; } + size_t allocBytes() const { return bytes; } + bool isPointerWithinAllocation(void* ptr) const; +}; + bool SmallBuffer::isNurseryOwned() const { return header_.get() & NURSERY_OWNED_BIT; } @@ -35,6 +66,10 @@ void SmallBuffer::setNurseryOwned(bool value) { header_.set(value ? NURSERY_OWNED_BIT : 0); } +size_t SmallBuffer::allocBytes() const { + return arena()->getThingSize() - sizeof(SmallBuffer); +} + inline MediumBuffer::MediumBuffer(uint8_t sizeClass, bool nurseryOwned) : sizeClass(sizeClass), isNurseryOwned(nurseryOwned) {} @@ -55,32 +90,16 @@ inline size_t MediumBuffer::bytesIncludingHeader() const { return BufferAllocator::SizeClassBytes(sizeClass); } -inline void* MediumBuffer::data() { return this + 1; } - -inline LargeBuffer::LargeBuffer(Zone* zone, size_t bytes, bool nurseryOwned) - : ChunkBase(zone->runtimeFromMainThread()), - zone(zone), - bytesIncludingHeader(bytes), - isNurseryOwned(nurseryOwned) { - kind = ChunkKind::LargeBuffer; - MOZ_ASSERT((bytes % PageSize) == 0); +inline size_t MediumBuffer::allocBytes() const { + return bytesIncludingHeader() - sizeof(MediumBuffer); } +inline void* MediumBuffer::data() { return this + 1; } + inline void LargeBuffer::check() const { MOZ_ASSERT(checkValue == LargeBufferCheckValue); } -inline bool LargeBuffer::markAtomic() { - do { - if (marked) { - return false; - } - } while (!marked.compareExchange(false, true)); - return true; -} - -inline void* LargeBuffer::data() { return this + 1; } - BufferAllocator::AutoLock::AutoLock(GCRuntime* gc) : LockGuard(gc->bufferAllocatorLock) {} @@ -139,12 +158,15 @@ struct BufferChunk : public ChunkBase, MainThreadOrGCTaskData decommittedPages; MainThreadOrGCTaskData allocBitmap; - MainThreadData zone; // Only used by GetAllocZone. MainThreadOrGCTaskData allocatedDuringCollection; MainThreadData hasNurseryOwnedAllocs; MainThreadOrGCTaskData hasNurseryOwnedAllocsAfterSweep; +#ifdef DEBUG + MainThreadData zone; +#endif + static BufferChunk* from(void* alloc) { ChunkBase* chunk = js::gc::detail::GetGCAddressChunkBase(alloc); MOZ_ASSERT(chunk->kind == ChunkKind::MediumBuffers); @@ -152,8 +174,11 @@ struct BufferChunk : public ChunkBase, } explicit BufferChunk(Zone* zone) - : ChunkBase(zone->runtimeFromMainThread(), ChunkKind::MediumBuffers), - zone(zone) {} + : ChunkBase(zone->runtimeFromMainThread(), ChunkKind::MediumBuffers) { +#ifdef DEBUG + this->zone = zone; +#endif + } ~BufferChunk() { MOZ_ASSERT(allocBitmap.ref().IsEmpty()); } @@ -414,7 +439,8 @@ BufferAllocator::BufferAllocator(Zone* zone) sweptLargeTenuredAllocs(lock()), minorState(State::NotCollecting), majorState(State::NotCollecting), - minorSweepingFinished(lock()) {} + minorSweepingFinished(lock()), + majorSweepingFinished(lock()) {} BufferAllocator::~BufferAllocator() { #ifdef DEBUG @@ -485,6 +511,29 @@ void* BufferAllocator::allocInGC(size_t bytes, bool nurseryOwned) { return result; } +template +static HeaderT* GetHeaderFromAlloc(void* alloc) { + static_assert(std::is_same_v || + std::is_same_v); + auto* header = reinterpret_cast(uintptr_t(alloc) - sizeof(HeaderT)); + header->check(); + return header; +} + +inline Cell* LargeBuffer::headerCell() { + return GetHeaderFromAlloc(this); +} + +#ifdef DEBUG + +inline Zone* LargeBuffer::zone() { return headerCell()->zone(); } + +inline Zone* LargeBuffer::zoneFromAnyThread() { + return headerCell()->zoneFromAnyThread(); +} + +#endif + #ifdef XP_DARWIN static inline void VirtualCopyPages(void* dst, const void* src, size_t bytes) { MOZ_ASSERT((uintptr_t(dst) & PageMask) == 0); @@ -508,35 +557,45 @@ void* BufferAllocator::realloc(void* ptr, size_t bytes, bool nurseryOwned) { return alloc(bytes, nurseryOwned); } - MOZ_ASSERT(GetAllocZone(ptr) == zone); - MOZ_ASSERT(IsNurseryOwned(ptr) == nurseryOwned); + MOZ_ASSERT(isNurseryOwned(ptr) == nurseryOwned); MOZ_ASSERT_IF(zone->isGCMarkingOrSweeping(), majorState == State::Marking); - size_t currentBytes = GetAllocSize(ptr); bytes = GetGoodAllocSize(bytes); - if (bytes == currentBytes) { - return ptr; - } - if (bytes > currentBytes) { - // Can only grow medium allocations. - if (IsMediumAlloc(ptr) && !IsLargeAllocSize(bytes)) { - if (growMedium(ptr, bytes)) { + size_t currentBytes; + if (IsLargeAlloc(ptr)) { + LargeBuffer* header = lookupLargeBuffer(ptr); + currentBytes = header->allocBytes(); + + // We can shrink large allocations (on some platforms). + if (bytes < header->allocBytes() && IsLargeAllocSize(bytes)) { + if (shrinkLarge(header, bytes)) { + return ptr; + } + } + } else if (IsMediumAlloc(ptr)) { + auto* header = GetHeaderFromAlloc(ptr); + currentBytes = header->allocBytes(); + + // We can grow or shrink medium allocations. + if (bytes < header->allocBytes() && !IsSmallAllocSize(bytes)) { + if (shrinkMedium(header, bytes)) { + return ptr; + } + } + + if (bytes > header->allocBytes() && !IsLargeAllocSize(bytes)) { + if (growMedium(header, bytes)) { return ptr; } } } else { - // Can shrink medium or large allocations. - if (IsMediumAlloc(ptr) && !IsSmallAllocSize(bytes)) { - if (shrinkMedium(ptr, bytes)) { - return ptr; - } - } - if (IsLargeAlloc(ptr) && IsLargeAllocSize(bytes)) { - if (shrinkLarge(ptr, bytes)) { - return ptr; - } - } + auto* header = GetHeaderFromAlloc(ptr); + currentBytes = header->allocBytes(); + } + + if (bytes == currentBytes) { + return ptr; } void* newPtr = alloc(bytes, nurseryOwned); @@ -550,13 +609,9 @@ void* BufferAllocator::realloc(void* ptr, size_t bytes, bool nurseryOwned) { #ifdef XP_DARWIN if (bytesToCopy >= ChunkSize) { - MOZ_ASSERT((uintptr_t(ptr) & PageMask) == (uintptr_t(newPtr) & PageMask)); - size_t alignBytes = PageSize - (uintptr_t(ptr) & PageMask); - memcpy(newPtr, ptr, alignBytes); - void* dst = reinterpret_cast(uintptr_t(newPtr) + alignBytes); - void* src = reinterpret_cast(uintptr_t(ptr) + alignBytes); - bytesToCopy -= alignBytes; - VirtualCopyPages(dst, src, bytesToCopy); + MOZ_ASSERT(IsLargeAlloc(ptr)); + MOZ_ASSERT(IsLargeAlloc(newPtr)); + VirtualCopyPages(newPtr, ptr, bytesToCopy); return newPtr; } #endif @@ -565,19 +620,8 @@ void* BufferAllocator::realloc(void* ptr, size_t bytes, bool nurseryOwned) { return newPtr; } -template -static HeaderT* GetHeaderFromAlloc(void* alloc) { - auto* header = reinterpret_cast(uintptr_t(alloc) - sizeof(HeaderT)); - header->check(); - return header; -} - void BufferAllocator::free(void* ptr) { MOZ_ASSERT(ptr); - MOZ_ASSERT(GetAllocZone(ptr) == zone); - - DebugOnlyPoison(ptr, JS_FREED_BUFFER_PATTERN, GetAllocSize(ptr), - MemCheckKind::MakeUndefined); if (IsLargeAlloc(ptr)) { freeLarge(ptr); @@ -597,9 +641,12 @@ bool BufferAllocator::IsBufferAlloc(void* alloc) { // Precondition: |alloc| is a pointer to a buffer allocation, a GC thing or a // direct nursery allocation returned by Nursery::allocateBuffer. + if (IsLargeAlloc(alloc)) { + return true; + } + ChunkKind chunkKind = detail::GetGCAddressChunkBase(alloc)->getKind(); - if (chunkKind == ChunkKind::MediumBuffers || - chunkKind == ChunkKind::LargeBuffer) { + if (chunkKind == ChunkKind::MediumBuffers) { return true; } @@ -611,42 +658,25 @@ bool BufferAllocator::IsBufferAlloc(void* alloc) { return false; } -/* static */ -size_t BufferAllocator::GetAllocSize(void* alloc) { +size_t BufferAllocator::getAllocSize(void* alloc) { if (IsLargeAlloc(alloc)) { - auto* header = GetHeaderFromAlloc(alloc); - return header->bytesIncludingHeader - sizeof(LargeBuffer); + LargeBuffer* header = lookupLargeBuffer(alloc); + return header->allocBytes(); } if (IsSmallAlloc(alloc)) { auto* cell = GetHeaderFromAlloc(alloc); - return cell->arena()->getThingSize() - sizeof(SmallBuffer); + return cell->allocBytes(); } MOZ_ASSERT(IsMediumAlloc(alloc)); auto* header = GetHeaderFromAlloc(alloc); - return SizeClassBytes(header->sizeClass) - sizeof(MediumBuffer); + return header->allocBytes(); } -/* static */ -JS::Zone* BufferAllocator::GetAllocZone(void* alloc) { +bool BufferAllocator::isNurseryOwned(void* alloc) { if (IsLargeAlloc(alloc)) { - auto* header = GetHeaderFromAlloc(alloc); - return header->zone; - } - - if (IsSmallAlloc(alloc)) { - auto* cell = GetHeaderFromAlloc(alloc); - return cell->zone(); - } - - return BufferChunk::from(alloc)->zone; -} - -/* static */ -bool BufferAllocator::IsNurseryOwned(void* alloc) { - if (IsLargeAlloc(alloc)) { - auto* header = GetHeaderFromAlloc(alloc); + LargeBuffer* header = lookupLargeBuffer(alloc); return header->isNurseryOwned; } @@ -662,55 +692,75 @@ bool BufferAllocator::IsNurseryOwned(void* alloc) { void BufferAllocator::markNurseryOwnedAlloc(void* alloc, bool ownerWasTenured) { MOZ_ASSERT(alloc); - MOZ_ASSERT(IsNurseryOwned(alloc)); - MOZ_ASSERT(GetAllocZone(alloc) == zone); + MOZ_ASSERT(isNurseryOwned(alloc)); MOZ_ASSERT(minorState == State::Marking); - if (IsSmallAlloc(alloc)) { - // This path is currently unused outside test code because we allocate - // nursery buffers directly in the nursery rather than using this allocator. - auto* cell = GetHeaderFromAlloc(alloc); - if (ownerWasTenured) { - cell->setNurseryOwned(false); - } - // Heap size tracked as part of GC heap for small allocations. - return; - } - if (IsLargeAlloc(alloc)) { - auto* header = GetHeaderFromAlloc(alloc); - largeNurseryAllocs.ref().remove(header); - if (ownerWasTenured) { - header->isNurseryOwned = false; - header->allocatedDuringCollection = majorState != State::NotCollecting; - largeTenuredAllocs.ref().pushBack(header); - size_t usableSize = header->bytesIncludingHeader - sizeof(LargeBuffer); - updateHeapSize(usableSize, false, false); - } else { - sweptLargeNurseryAllocs.ref().pushBack(header); - } + LargeBuffer* buffer = lookupLargeBuffer(alloc); + MOZ_ASSERT(buffer->zone() == zone); + markLargeNurseryOwnedBuffer(buffer, ownerWasTenured); return; } - MOZ_ASSERT(IsMediumAlloc(alloc)); - auto* header = GetHeaderFromAlloc(alloc); - MOZ_ASSERT(BufferChunk::from(alloc)->hasNurseryOwnedAllocs); - if (ownerWasTenured) { - header->isNurseryOwned = false; - size_t usableSize = - SizeClassBytes(header->sizeClass) - sizeof(MediumBuffer); - updateHeapSize(usableSize, false, false); - } else { - BufferChunk* chunk = BufferChunk::from(alloc); - MOZ_ASSERT(chunk->isAllocated(alloc)); - chunk->markBits.ref().markIfUnmarked(alloc, MarkColor::Black); + if (IsSmallAlloc(alloc)) { + auto* buffer = GetHeaderFromAlloc(alloc); + markSmallNurseryOwnedBuffer(buffer, ownerWasTenured); + return; } + + auto* buffer = GetHeaderFromAlloc(alloc); + markMediumNurseryOwnedBuffer(buffer, ownerWasTenured); } -/* static */ -bool BufferAllocator::IsMarkedBlack(void* alloc) { +void BufferAllocator::markSmallNurseryOwnedBuffer(SmallBuffer* buffer, + bool ownerWasTenured) { + MOZ_ASSERT(buffer->zone() == zone); + + if (ownerWasTenured) { + buffer->setNurseryOwned(false); + } + + // Heap size is tracked as part of GC heap for small allocations. +} + +void BufferAllocator::markMediumNurseryOwnedBuffer(MediumBuffer* buffer, + bool ownerWasTenured) { + BufferChunk* chunk = BufferChunk::from(buffer); + MOZ_ASSERT(chunk->zone == zone); + MOZ_ASSERT(chunk->hasNurseryOwnedAllocs); + MOZ_ASSERT(chunk->isAllocated(buffer->data())); + + if (ownerWasTenured) { + // Change the allocation to a tenured owned one. This prevents sweeping in a + // minor collection. + buffer->isNurseryOwned = false; + size_t usableSize = buffer->allocBytes(); + updateHeapSize(usableSize, false, false); + return; + } + + chunk->markBits.ref().markIfUnmarked(buffer->data(), MarkColor::Black); +} + +void BufferAllocator::markLargeNurseryOwnedBuffer(LargeBuffer* buffer, + bool ownerWasTenured) { + largeNurseryAllocsToSweep.ref().remove(buffer); + + if (ownerWasTenured) { + buffer->isNurseryOwned = false; + buffer->allocatedDuringCollection = majorState != State::NotCollecting; + largeTenuredAllocs.ref().pushBack(buffer); + size_t usableSize = buffer->allocBytes(); + updateHeapSize(usableSize, false, false); + return; + } + + largeNurseryAllocs.ref().pushBack(buffer); +} + +bool BufferAllocator::isMarkedBlack(void* alloc) { if (IsLargeAlloc(alloc)) { - return IsLargeAllocMarked(alloc); + return isLargeAllocMarked(alloc); } if (IsSmallAlloc(alloc)) { @@ -725,8 +775,7 @@ bool BufferAllocator::IsMarkedBlack(void* alloc) { return chunk->markBits.ref().isMarkedBlack(alloc); } -/* static */ -void BufferAllocator::TraceEdge(JSTracer* trc, Cell* owner, void** bufferp, +void BufferAllocator::traceEdge(JSTracer* trc, Cell* owner, void** bufferp, const char* name) { // Buffers are conceptually part of the owning cell and are not reported to // the tracer. @@ -739,7 +788,8 @@ void BufferAllocator::TraceEdge(JSTracer* trc, Cell* owner, void** bufferp, void* buffer = *bufferp; MOZ_ASSERT(buffer); - if (js::gc::detail::GetGCAddressChunkBase(buffer)->isNurseryChunk()) { + if (!IsLargeAlloc(buffer) && + js::gc::detail::GetGCAddressChunkBase(buffer)->isNurseryChunk()) { // JSObject slots and elements can be allocated in the nursery and this is // handled separately. return; @@ -747,46 +797,95 @@ void BufferAllocator::TraceEdge(JSTracer* trc, Cell* owner, void** bufferp, MOZ_ASSERT(IsBufferAlloc(buffer)); - if (IsSmallAlloc(buffer)) { - auto* cell = GetHeaderFromAlloc(buffer); - TraceManuallyBarrieredEdge(trc, &cell, name); - if (cell != GetHeaderFromAlloc(buffer)) { - *bufferp = cell->data(); - } + if (IsLargeAlloc(buffer)) { + traceLargeAlloc(trc, owner, bufferp, name); return; } + if (IsSmallAlloc(buffer)) { + traceSmallAlloc(trc, owner, bufferp, name); + return; + } + + traceMediumAlloc(trc, owner, bufferp, name); +} + +void BufferAllocator::traceSmallAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name) { + void* alloc = *allocp; + auto* cell = GetHeaderFromAlloc(alloc); + TraceManuallyBarrieredEdge(trc, &cell, name); + if (cell != GetHeaderFromAlloc(alloc)) { + *allocp = cell->data(); + } +} + +void BufferAllocator::traceMediumAlloc(JSTracer* trc, Cell* owner, + void** allocp, const char* name) { + void* alloc = *allocp; + auto* buffer = GetHeaderFromAlloc(alloc); + if (trc->isTenuringTracer()) { - if (IsNurseryOwned(buffer)) { - Zone* zone = owner->zone(); - zone->bufferAllocator.markNurseryOwnedAlloc(buffer, owner->isTenured()); + if (buffer->isNurseryOwned) { + markMediumNurseryOwnedBuffer(buffer, owner->isTenured()); } return; } if (trc->isMarkingTracer()) { - if (!IsNurseryOwned(buffer)) { - MOZ_ASSERT(!ChunkPtrIsInsideNursery(buffer)); - MarkTenuredAlloc(buffer); + if (!buffer->isNurseryOwned) { + markMediumTenuredAlloc(alloc); } return; } } -/* static */ -bool BufferAllocator::MarkTenuredAlloc(void* alloc) { +void BufferAllocator::traceLargeAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name) { + void* alloc = *allocp; + LargeBuffer* buffer = lookupLargeBuffer(alloc); + + // Trace small buffer that holds large buffer metadata. + // For moving GC the table is updated in fixupAfterMovingGC(). + traceSmallAlloc(trc, owner, reinterpret_cast(&buffer), "LargeBuffer"); + + if (trc->isTenuringTracer()) { + if (isNurseryOwned(alloc)) { + markLargeNurseryOwnedBuffer(buffer, owner->isTenured()); + } + return; + } + + if (trc->isMarkingTracer()) { + if (!isNurseryOwned(alloc)) { + markLargeTenuredBuffer(buffer); + } + return; + } +} + +bool BufferAllocator::markTenuredAlloc(void* alloc) { MOZ_ASSERT(alloc); - MOZ_ASSERT(!IsNurseryOwned(alloc)); + MOZ_ASSERT(!isNurseryOwned(alloc)); if (IsLargeAlloc(alloc)) { - return MarkLargeAlloc(alloc); + LargeBuffer* buffer = lookupLargeBuffer(alloc); + return markLargeTenuredBuffer(buffer); } if (IsSmallAlloc(alloc)) { - auto* cell = GetHeaderFromAlloc(alloc); - return cell->markIfUnmarkedAtomic(MarkColor::Black); + return markSmallTenuredAlloc(alloc); } + return markMediumTenuredAlloc(alloc); +} + +bool BufferAllocator::markSmallTenuredAlloc(void* alloc) { + auto* cell = GetHeaderFromAlloc(alloc); + return cell->markIfUnmarkedAtomic(MarkColor::Black); +} + +bool BufferAllocator::markMediumTenuredAlloc(void* alloc) { BufferChunk* chunk = BufferChunk::from(alloc); MOZ_ASSERT(chunk->isAllocated(alloc)); if (chunk->allocatedDuringCollection) { @@ -804,17 +903,18 @@ void BufferAllocator::startMinorCollection(MaybeLock& lock) { MOZ_ASSERT(minorState == State::NotCollecting); if (majorState == State::NotCollecting) { checkGCStateNotInUse(lock); - } else { - // Large allocations that are marked when tracing the nursery will be moved - // to this list. - MOZ_ASSERT(sweptLargeNurseryAllocs.ref().isEmpty()); } #endif + // Large allocations that are marked when tracing the nursery will be moved + // back to the main list. + MOZ_ASSERT(largeNurseryAllocsToSweep.ref().isEmpty()); + std::swap(largeNurseryAllocs.ref(), largeNurseryAllocsToSweep.ref()); + minorState = State::Marking; } -bool BufferAllocator::startMinorSweeping(LargeAllocList& largeAllocsToFree) { +bool BufferAllocator::startMinorSweeping() { // Called during minor GC. Operates on the active allocs/chunks lists. The 'to // sweep' lists do not contain nursery owned allocations. @@ -827,24 +927,16 @@ bool BufferAllocator::startMinorSweeping(LargeAllocList& largeAllocsToFree) { } for (LargeBuffer* header : largeNurseryAllocs.ref()) { MOZ_ASSERT(header->isNurseryOwned); - MOZ_ASSERT(!header->marked); } - for (LargeBuffer* header : sweptLargeNurseryAllocs.ref()) { + for (LargeBuffer* header : largeNurseryAllocsToSweep.ref()) { MOZ_ASSERT(header->isNurseryOwned); - MOZ_ASSERT(!header->marked); } #endif - // Large nursery allocations are moved out of |largeNurseryAllocs| when they - // are marked, so any remaining are ready to be freed. Move them to the output - // list. - largeAllocsToFree.append(std::move(largeNurseryAllocs.ref())); - MOZ_ASSERT(largeNurseryAllocs.ref().isEmpty()); - largeNurseryAllocs.ref() = std::move(sweptLargeNurseryAllocs.ref()); - // Check whether there are any medium chunks containing nursery owned // allocations that need to be swept. - if (mediumMixedChunks.ref().isEmpty()) { + if (mediumMixedChunks.ref().isEmpty() && + largeNurseryAllocsToSweep.ref().isEmpty()) { // Nothing more to do. Don't transition to sweeping state. minorState = State::NotCollecting; return false; @@ -900,20 +992,24 @@ void BufferAllocator::sweepForMinorCollection() { } } + // Bug 1961749: Freeing large buffers can be slow so it might be worth + // splitting sweeping into two phases so that all zones get their medium + // buffers swept and made available for allocation before any large buffers + // are freed. + // Alternatively this could happen in parallel to sweeping medium buffers. + + while (!largeNurseryAllocsToSweep.ref().isEmpty()) { + LargeBuffer* header = largeNurseryAllocsToSweep.ref().popFirst(); + MaybeLock lock(std::in_place, this); + unmapLarge(header, true, lock); + } + // Signal to main thread to update minorState. AutoLock lock(this); MOZ_ASSERT(!minorSweepingFinished); minorSweepingFinished = true; } -/* static */ -void BufferAllocator::FreeLargeAllocs(LargeAllocList& largeAllocsToFree) { - while (!largeAllocsToFree.isEmpty()) { - LargeBuffer* header = largeAllocsToFree.popFirst(); - header->zone->bufferAllocator.unmapLarge(header, true); - } -} - void BufferAllocator::startMajorCollection(MaybeLock& lock) { maybeMergeSweptData(lock); @@ -955,6 +1051,7 @@ void BufferAllocator::startMajorSweeping(MaybeLock& lock) { #ifdef DEBUG MOZ_ASSERT(majorState == State::Marking); MOZ_ASSERT(zone->isGCFinished()); + MOZ_ASSERT(!majorSweepingFinished.refNoCheck()); #endif maybeMergeSweptData(lock); @@ -1000,6 +1097,10 @@ void BufferAllocator::sweepForMajorCollection(bool shouldDecommit) { // there's currently no advantage to that. AutoLock lock(this); sweptLargeTenuredAllocs.ref() = std::move(sweptList); + + // Signal to main thread to update majorState. + MOZ_ASSERT(!majorSweepingFinished); + majorSweepingFinished = true; } static void ClearAllocatedDuringCollection(SlimLinkedList& list) { @@ -1014,58 +1115,66 @@ static void ClearAllocatedDuringCollection(SlimLinkedList& list) { } void BufferAllocator::finishMajorCollection(const AutoLock& lock) { - // This can be called without startMajorSweeping if collection is aborted. - MOZ_ASSERT(majorState == State::Marking || majorState == State::Sweeping); + // This can be called in any state: + // + // - NotCollecting: after major sweeping has finished and the state has been + // reset to NotCollecting in mergeSweptData. + // + // - Marking: if collection was aborted and startMajorSweeping was not + // called. + // + // - Sweeping: if sweeping has finished and mergeSweptData has not been + // called yet. - ClearAllocatedDuringCollection(mediumMixedChunks.ref()); - ClearAllocatedDuringCollection(mediumTenuredChunks.ref()); - // This flag is not set for large nursery-owned allocations. - ClearAllocatedDuringCollection(largeTenuredAllocs.ref()); - - if (minorState == State::Sweeping) { - // Ensure this flag is cleared when chunks are merged in mergeSweptData. - majorFinishedWhileMinorSweeping = true; - } + MOZ_ASSERT_IF(majorState == State::Sweeping, majorSweepingFinished); if (minorState == State::Sweeping || majorState == State::Sweeping) { mergeSweptData(lock); } - MOZ_ASSERT_IF(majorState == State::Marking, - sweptMediumTenuredChunks.ref().isEmpty()); - MOZ_ASSERT_IF(majorState == State::Sweeping, - mediumTenuredChunksToSweep.ref().isEmpty()); - if (majorState == State::Marking) { - // We have aborted collection without sweeping this zone. Restore or rebuild - // the original state. - - for (BufferChunk* chunk : mediumTenuredChunksToSweep.ref()) { - chunk->markBits.ref().clear(); - } - for (LargeBuffer* alloc : largeTenuredAllocsToSweep.ref()) { - alloc->marked = false; - } - - // Rebuild free lists for chunks we didn't end up sweeping. - for (BufferChunk* chunk : mediumTenuredChunksToSweep.ref()) { - MOZ_ALWAYS_TRUE( - sweepChunk(chunk, OwnerKind::None, false, mediumFreeLists.ref())); - } - - mediumTenuredChunks.ref().prepend( - std::move(mediumTenuredChunksToSweep.ref())); - largeTenuredAllocs.ref().prepend( - std::move(largeTenuredAllocsToSweep.ref())); + abortMajorSweeping(lock); } - majorState = State::NotCollecting; - #ifdef DEBUG checkGCStateNotInUse(lock); #endif } +void BufferAllocator::abortMajorSweeping(const AutoLock& lock) { + // We have aborted collection without sweeping this zone. Restore or rebuild + // the original state. + + MOZ_ASSERT(majorState == State::Marking); + MOZ_ASSERT(sweptMediumTenuredChunks.ref().isEmpty()); + + clearAllocatedDuringCollectionState(lock); + + for (BufferChunk* chunk : mediumTenuredChunksToSweep.ref()) { + chunk->markBits.ref().clear(); + } + + // Rebuild free lists for chunks we didn't end up sweeping. + for (BufferChunk* chunk : mediumTenuredChunksToSweep.ref()) { + MOZ_ALWAYS_TRUE( + sweepChunk(chunk, OwnerKind::None, false, mediumFreeLists.ref())); + } + + mediumTenuredChunks.ref().prepend( + std::move(mediumTenuredChunksToSweep.ref())); + largeTenuredAllocs.ref().prepend(std::move(largeTenuredAllocsToSweep.ref())); + + majorState = State::NotCollecting; +} + +void BufferAllocator::clearAllocatedDuringCollectionState( + const AutoLock& lock) { + ClearAllocatedDuringCollection(mediumMixedChunks.ref()); + ClearAllocatedDuringCollection(mediumTenuredChunks.ref()); + // This flag is not set for large nursery-owned allocations. + ClearAllocatedDuringCollection(largeTenuredAllocs.ref()); +} + void BufferAllocator::maybeMergeSweptData() { if (minorState == State::Sweeping || majorState == State::Sweeping) { mergeSweptData(); @@ -1089,6 +1198,14 @@ void BufferAllocator::maybeMergeSweptData(MaybeLock& lock) { void BufferAllocator::mergeSweptData(const AutoLock& lock) { MOZ_ASSERT(minorState == State::Sweeping || majorState == State::Sweeping); + if (majorSweepingFinished) { + clearAllocatedDuringCollectionState(lock); + + if (minorState == State::Sweeping) { + majorFinishedWhileMinorSweeping = true; + } + } + // Merge swept chunks that previously contained nursery owned allocations. If // semispace nursery collection is in use then these chunks may contain both // nursery and tenured-owned allocations, otherwise all allocations will be @@ -1151,6 +1268,68 @@ void BufferAllocator::mergeSweptData(const AutoLock& lock) { } #endif } + + if (majorSweepingFinished) { + MOZ_ASSERT(majorState == State::Sweeping); + majorState = State::NotCollecting; + majorSweepingFinished = false; + + MOZ_ASSERT(mediumTenuredChunksToSweep.ref().isEmpty()); + } +} + +void BufferAllocator::prepareForMovingGC() { + maybeMergeSweptData(); + + MOZ_ASSERT(majorState == State::NotCollecting); + MOZ_ASSERT(minorState == State::NotCollecting); + MOZ_ASSERT(largeNurseryAllocsToSweep.ref().isEmpty()); + MOZ_ASSERT(largeTenuredAllocsToSweep.ref().isEmpty()); + +#ifdef DEBUG + MOZ_ASSERT(!movingGCInProgress); + movingGCInProgress = true; +#endif + + // Remove large buffer metadata objects from their linked lists so we can move + // them without breaking the links. + for (auto i = largeAllocMap.ref().iter(); !i.done(); i.next()) { + LargeBuffer* buffer = i.get().value(); + if (buffer->isNurseryOwned) { + largeNurseryAllocs.ref().remove(buffer); + } else { + largeTenuredAllocs.ref().remove(buffer); + } + } + + MOZ_ASSERT(largeNurseryAllocs.ref().isEmpty()); + MOZ_ASSERT(largeTenuredAllocs.ref().isEmpty()); +} + +void BufferAllocator::fixupAfterMovingGC() { +#ifdef DEBUG + MOZ_ASSERT(movingGCInProgress); + movingGCInProgress = false; +#endif + + // Update our pointers to large allocation metadata objects and return them to + // their lists. + for (auto i = largeAllocMap.ref().iter(); !i.done(); i.next()) { + LargeBuffer* buffer = i.get().value(); + auto* header = GetHeaderFromAlloc(buffer); + if (IsForwarded(header)) { + header = Forwarded(header); + buffer = static_cast(header->data()); + i.get().value() = buffer; + } + + MOZ_ASSERT(!buffer->isInList()); + if (buffer->isNurseryOwned) { + largeNurseryAllocs.ref().pushBack(buffer); + } else { + largeTenuredAllocs.ref().pushBack(buffer); + } + } } void BufferAllocator::clearMarkStateAfterBarrierVerification() { @@ -1165,11 +1344,6 @@ void BufferAllocator::clearMarkStateAfterBarrierVerification() { chunk->markBits.ref().clear(); } } - for (auto* allocs : {&largeNurseryAllocs.ref(), &largeTenuredAllocs.ref()}) { - for (auto* alloc : *allocs) { - alloc->marked = false; - } - } } bool BufferAllocator::isPointerWithinMediumOrLargeBuffer(void* ptr) { @@ -1224,7 +1398,7 @@ bool BufferChunk::isPointerWithinAllocation(void* ptr) const { } bool LargeBuffer::isPointerWithinAllocation(void* ptr) const { - return uintptr_t(ptr) - uintptr_t(this) < bytesIncludingHeader; + return uintptr_t(ptr) - uintptr_t(alloc) < bytes; } #ifdef DEBUG @@ -1257,6 +1431,7 @@ void BufferAllocator::checkGCStateNotInUse(const AutoLock& lock) { checkChunkListGCStateNotInUse(sweptMediumTenuredChunks.ref(), false, false); } else { MOZ_ASSERT(mediumMixedChunksToSweep.ref().isEmpty()); + MOZ_ASSERT(largeNurseryAllocsToSweep.ref().isEmpty()); MOZ_ASSERT(sweptMediumMixedChunks.ref().isEmpty()); MOZ_ASSERT(sweptMediumTenuredChunks.ref().isEmpty()); @@ -1267,6 +1442,7 @@ void BufferAllocator::checkGCStateNotInUse(const AutoLock& lock) { MOZ_ASSERT(!majorFinishedWhileMinorSweeping); MOZ_ASSERT(!sweptChunksAvailable); MOZ_ASSERT(!minorSweepingFinished); + MOZ_ASSERT(!majorSweepingFinished); } MOZ_ASSERT(mediumTenuredChunksToSweep.ref().isEmpty()); @@ -1275,9 +1451,9 @@ void BufferAllocator::checkGCStateNotInUse(const AutoLock& lock) { checkAllocListGCStateNotInUse(largeTenuredAllocs.ref(), false); MOZ_ASSERT(largeTenuredAllocsToSweep.ref().isEmpty()); - - MOZ_ASSERT(sweptLargeNurseryAllocs.ref().isEmpty()); MOZ_ASSERT(sweptLargeTenuredAllocs.ref().isEmpty()); + + MOZ_ASSERT(!movingGCInProgress); } void BufferAllocator::checkChunkListGCStateNotInUse( @@ -1351,7 +1527,6 @@ void BufferAllocator::checkAllocListGCStateNotInUse(LargeAllocList& list, bool isNurseryOwned) { for (LargeBuffer* header : list) { MOZ_ASSERT(header->isNurseryOwned == isNurseryOwned); - MOZ_ASSERT(!header->marked); MOZ_ASSERT_IF(!isNurseryOwned, !header->allocatedDuringCollection); } } @@ -1372,8 +1547,8 @@ void* BufferAllocator::allocSmall(size_t bytes, bool nurseryOwned) { void* alloc = cell->data(); MOZ_ASSERT(IsSmallAlloc(alloc)); - MOZ_ASSERT(GetAllocSize(alloc) >= bytes); - MOZ_ASSERT(GetAllocSize(alloc) < 2 * (bytes + sizeof(SmallBuffer))); + MOZ_ASSERT(getAllocSize(alloc) >= bytes); + MOZ_ASSERT(getAllocSize(alloc) < 2 * (bytes + sizeof(SmallBuffer))); return alloc; } @@ -1391,8 +1566,8 @@ void* BufferAllocator::allocSmallInGC(size_t bytes, bool nurseryOwned) { cell->setNurseryOwned(nurseryOwned); void* alloc = cell->data(); - MOZ_ASSERT(GetAllocSize(alloc) >= bytes); - MOZ_ASSERT(GetAllocSize(alloc) < 2 * (bytes + sizeof(SmallBuffer))); + MOZ_ASSERT(getAllocSize(alloc) >= bytes); + MOZ_ASSERT(getAllocSize(alloc) < 2 * (bytes + sizeof(SmallBuffer))); return alloc; } @@ -1422,6 +1597,10 @@ AllocKind BufferAllocator::AllocKindForSmallAlloc(size_t bytes) { bool BufferAllocator::IsSmallAlloc(void* alloc) { MOZ_ASSERT(IsBufferAlloc(alloc)); + // Test for large buffers before calling this so we can assume |alloc| is + // inside a chunk. + MOZ_ASSERT(!IsLargeAlloc(alloc)); + ChunkBase* chunk = detail::GetGCAddressChunkBase(alloc); return chunk->getKind() == ChunkKind::TenuredArenas; } @@ -1666,8 +1845,7 @@ bool BufferAllocator::sweepChunk(BufferChunk* chunk, OwnerKind ownerKindToSweep, // Dead. Update allocated bitmap and heap size accounting. chunk->setAllocated(header, false); if (!header->isNurseryOwned) { - size_t usableBytes = bytes - sizeof(MediumBuffer); - mallocHeapBytesFreed += usableBytes; + mallocHeapBytesFreed += header->allocBytes(); } PoisonAlloc(header, JS_SWEPT_TENURED_PATTERN, bytes, MemCheckKind::MakeUndefined); @@ -1773,13 +1951,17 @@ void BufferAllocator::freeMedium(void* alloc) { // neighboring free regions. Coalescing is necessary for resize to work // properly. + auto* header = GetHeaderFromAlloc(alloc); + DebugOnlyPoison(alloc, JS_FREED_BUFFER_PATTERN, header->allocBytes(), + MemCheckKind::MakeUndefined); + BufferChunk* chunk = BufferChunk::from(alloc); + MOZ_ASSERT(chunk->zone == zone); + if (isSweepingChunk(chunk)) { return; // We can't free if the chunk is currently being swept. } - auto* header = GetHeaderFromAlloc(alloc); - // Set region as not allocated and then clear mark bit. chunk->setAllocated(alloc, false); @@ -1793,11 +1975,11 @@ void BufferAllocator::freeMedium(void* alloc) { if (!header->isNurseryOwned) { bool updateRetained = majorState == State::Marking && !chunk->allocatedDuringCollection; - size_t usableBytes = bytes - sizeof(MediumBuffer); - zone->mallocHeapSize.removeBytes(usableBytes, updateRetained); + zone->mallocHeapSize.removeBytes(bytes - sizeof(MediumBuffer), + updateRetained); } - PoisonAlloc(header, JS_SWEPT_TENURED_PATTERN, bytes, + PoisonAlloc(header, JS_FREED_BUFFER_PATTERN, sizeof(MediumBuffer), MemCheckKind::MakeUndefined); FreeLists* freeLists = getChunkFreeLists(chunk); @@ -1921,13 +2103,14 @@ void BufferAllocator::updateFreeRegionStart(FreeLists* freeLists, } } -bool BufferAllocator::growMedium(void* alloc, size_t newBytes) { - BufferChunk* chunk = BufferChunk::from(alloc); +bool BufferAllocator::growMedium(MediumBuffer* header, size_t newBytes) { + BufferChunk* chunk = BufferChunk::from(header); + MOZ_ASSERT(chunk->zone == zone); + if (isSweepingChunk(chunk)) { return false; // We can't grow if the chunk is currently being swept. } - auto* header = GetHeaderFromAlloc(alloc); newBytes += sizeof(MediumBuffer); size_t currentBytes = SizeClassBytes(header->sizeClass); @@ -1972,13 +2155,14 @@ bool BufferAllocator::growMedium(void* alloc, size_t newBytes) { return true; } -bool BufferAllocator::shrinkMedium(void* alloc, size_t newBytes) { - BufferChunk* chunk = BufferChunk::from(alloc); +bool BufferAllocator::shrinkMedium(MediumBuffer* header, size_t newBytes) { + BufferChunk* chunk = BufferChunk::from(header); + MOZ_ASSERT(chunk->zone == zone); + if (isSweepingChunk(chunk)) { return false; // We can't shrink if the chunk is currently being swept. } - auto* header = GetHeaderFromAlloc(alloc); size_t currentBytes = SizeClassBytes(header->sizeClass); newBytes += sizeof(MediumBuffer); @@ -2143,41 +2327,83 @@ bool BufferAllocator::IsMediumAlloc(void* alloc) { return chunk->getKind() == ChunkKind::MediumBuffers; } -void* BufferAllocator::allocLarge(size_t bytes, bool nurseryOwned, bool inGC) { - size_t totalBytes = RoundUp(bytes + sizeof(LargeBuffer), ChunkSize); - MOZ_ASSERT(totalBytes > MaxMediumAllocSize); - MOZ_ASSERT(totalBytes >= bytes); +bool BufferAllocator::needLockToAccessBufferMap() const { + MOZ_ASSERT(CurrentThreadCanAccessZone(zone) || CurrentThreadIsGCMarking()); + return minorState.refNoCheck() == State::Sweeping || + majorState.refNoCheck() == State::Sweeping; +} - // Large allocations are aligned to the chunk size, even if they are smaller - // than a chunk. This allows us to tell different kinds of buffer allocation - // apart by looking at the chunk kind. - void* ptr = MapAlignedPages(totalBytes, ChunkSize, ShouldStallAndRetry(inGC)); - if (!ptr) { +LargeBuffer* BufferAllocator::lookupLargeBuffer(void* alloc) { + MaybeLock lock; + return lookupLargeBuffer(alloc, lock); +} + +LargeBuffer* BufferAllocator::lookupLargeBuffer(void* alloc, MaybeLock& lock) { + MOZ_ASSERT(lock.isNothing()); + if (needLockToAccessBufferMap()) { + lock.emplace(this); + } + + auto ptr = largeAllocMap.ref().lookup(alloc); + MOZ_ASSERT(ptr); + LargeBuffer* buffer = ptr->value(); + MOZ_ASSERT(buffer->data() == alloc); + MOZ_ASSERT(buffer->zone() == zone); + return buffer; +} + +void* BufferAllocator::allocLarge(size_t bytes, bool nurseryOwned, bool inGC) { + bytes = RoundUp(bytes, ChunkSize); + MOZ_ASSERT(bytes > MaxMediumAllocSize); + MOZ_ASSERT(bytes >= bytes); + + // Allocate a small buffer the size of a LargeBuffer to hold the metadata. + static_assert(sizeof(LargeBuffer) <= MaxSmallAllocSize); + void* bufferPtr = allocSmall(sizeof(LargeBuffer), nurseryOwned); + if (!bufferPtr) { return nullptr; } + // Large allocations are aligned to the chunk size, even if they are smaller + // than a chunk. This allows us to tell large buffer allocations apart by + // looking at the pointer alignment. + void* ptr = MapAlignedPages(bytes, ChunkSize, ShouldStallAndRetry(inGC)); + if (!ptr) { + return nullptr; + } + auto freeGuard = mozilla::MakeScopeExit([&]() { UnmapPages(ptr, bytes); }); + + auto* buffer = new (bufferPtr) LargeBuffer(ptr, bytes, nurseryOwned); + CheckHighBitsOfPointer(ptr); - auto* header = new (ptr) LargeBuffer(zone, totalBytes, nurseryOwned); + { + MaybeLock lock; + if (needLockToAccessBufferMap()) { + lock.emplace(this); + } + if (!largeAllocMap.ref().putNew(ptr, buffer)) { + return nullptr; + } + } + + freeGuard.release(); if (nurseryOwned) { - largeNurseryAllocs.ref().pushBack(header); + largeNurseryAllocs.ref().pushBack(buffer); } else { - header->allocatedDuringCollection = majorState != State::NotCollecting; - largeTenuredAllocs.ref().pushBack(header); + buffer->allocatedDuringCollection = majorState != State::NotCollecting; + largeTenuredAllocs.ref().pushBack(buffer); } // Update memory accounting and trigger an incremental slice if needed. if (!nurseryOwned) { - size_t usableBytes = totalBytes - sizeof(LargeBuffer); bool checkThresholds = !inGC; - updateHeapSize(usableBytes, checkThresholds, false); + updateHeapSize(bytes, checkThresholds, false); } - void* alloc = header->data(); - MOZ_ASSERT(IsLargeAlloc(alloc)); - - return alloc; + MOZ_ASSERT(IsLargeAlloc(ptr)); + return ptr; } void BufferAllocator::updateHeapSize(size_t bytes, bool checkThresholds, @@ -2193,48 +2419,49 @@ void BufferAllocator::updateHeapSize(size_t bytes, bool checkThresholds, /* static */ bool BufferAllocator::IsLargeAlloc(void* alloc) { - ChunkBase* chunk = js::gc::detail::GetGCAddressChunkBase(alloc); - return chunk->kind == ChunkKind::LargeBuffer; + return (uintptr_t(alloc) & ChunkMask) == 0; } -/* static */ -bool BufferAllocator::IsLargeAllocMarked(void* alloc) { - auto* header = GetHeaderFromAlloc(alloc); - return header->marked; +bool BufferAllocator::isLargeAllocMarked(void* alloc) { + LargeBuffer* header = lookupLargeBuffer(alloc); + return header->headerCell()->isMarkedAny(); } -/* static */ -bool BufferAllocator::MarkLargeAlloc(void* alloc) { - auto* header = GetHeaderFromAlloc(alloc); - if (header->allocatedDuringCollection) { +bool BufferAllocator::markLargeTenuredBuffer(LargeBuffer* buffer) { + MOZ_ASSERT(!buffer->isNurseryOwned); + + if (buffer->allocatedDuringCollection) { return false; } - if (header->isNurseryOwned) { - // Nursery-owned allocations are always marked. - return false; - } + auto* headerCell = GetHeaderFromAlloc(buffer); - return header->markAtomic(); + // Bug 1961755: This method can return false positives. A fully atomic version + // would be preferable in this case. + return headerCell->markIfUnmarkedAtomic(MarkColor::Black); } bool BufferAllocator::sweepLargeTenured(LargeBuffer* header) { MOZ_ASSERT(!header->isNurseryOwned); - MOZ_ASSERT(header->zone == zone); + MOZ_ASSERT(header->zoneFromAnyThread() == zone); MOZ_ASSERT(!header->isInList()); - if (!header->marked) { - unmapLarge(header, true); - return false; + if (header->headerCell()->isMarkedAny()) { + return true; } - header->marked = false; - return true; + MaybeLock lock(std::in_place, this); + unmapLarge(header, true, lock); + return false; } void BufferAllocator::freeLarge(void* alloc) { - auto* header = GetHeaderFromAlloc(alloc); - MOZ_ASSERT(header->zone == zone); + MaybeLock lock; + LargeBuffer* header = lookupLargeBuffer(alloc, lock); + MOZ_ASSERT(header->zone() == zone); + + DebugOnlyPoison(alloc, JS_FREED_BUFFER_PATTERN, header->allocBytes(), + MemCheckKind::MakeUndefined); if (!header->isNurseryOwned && majorState == State::Sweeping && !header->allocatedDuringCollection) { @@ -2252,13 +2479,11 @@ void BufferAllocator::freeLarge(void* alloc) { largeTenuredAllocs.ref().remove(header); } - unmapLarge(header, false); + unmapLarge(header, false, lock); } -bool BufferAllocator::shrinkLarge(void* alloc, size_t newBytes) { - MOZ_ASSERT(IsLargeAlloc(alloc)); +bool BufferAllocator::shrinkLarge(LargeBuffer* header, size_t newBytes) { MOZ_ASSERT(IsLargeAllocSize(newBytes)); - #ifdef XP_WIN // Can't unmap part of a region mapped with VirtualAlloc on Windows. // @@ -2267,8 +2492,7 @@ bool BufferAllocator::shrinkLarge(void* alloc, size_t newBytes) { // grow the allocation again if necessary. return false; #else - auto* header = GetHeaderFromAlloc(alloc); - MOZ_ASSERT(header->zone == zone); + MOZ_ASSERT(header->zone() == zone); if (!header->isNurseryOwned && majorState == State::Sweeping && !header->allocatedDuringCollection) { @@ -2277,8 +2501,8 @@ bool BufferAllocator::shrinkLarge(void* alloc, size_t newBytes) { MOZ_ASSERT(header->isInList()); - newBytes = RoundUp(newBytes + sizeof(LargeBuffer), PageSize); - size_t oldBytes = header->bytesIncludingHeader; + newBytes = RoundUp(newBytes, ChunkSize); + size_t oldBytes = header->bytes; MOZ_ASSERT(oldBytes > newBytes); size_t shrinkBytes = oldBytes - newBytes; @@ -2286,26 +2510,37 @@ bool BufferAllocator::shrinkLarge(void* alloc, size_t newBytes) { zone->mallocHeapSize.removeBytes(shrinkBytes, false); } - header->bytesIncludingHeader = newBytes; - void* endPtr = reinterpret_cast(uintptr_t(header) + newBytes); + header->bytes = newBytes; + + void* endPtr = reinterpret_cast(uintptr_t(header->data()) + newBytes); UnmapPages(endPtr, shrinkBytes); return true; #endif } -void BufferAllocator::unmapLarge(LargeBuffer* header, bool isSweeping) { - MOZ_ASSERT(header->zone == zone); +void BufferAllocator::unmapLarge(LargeBuffer* header, bool isSweeping, + MaybeLock& lock) { + MOZ_ASSERT(header->zoneFromAnyThread() == zone); MOZ_ASSERT(!header->isInList()); + MOZ_ASSERT_IF(isSweeping || needLockToAccessBufferMap(), lock.isSome()); - size_t bytes = header->bytesIncludingHeader; +#ifdef DEBUG + auto ptr = largeAllocMap.ref().lookup(header->data()); + MOZ_ASSERT(ptr && ptr->value() == header); +#endif + largeAllocMap.ref().remove(header->data()); + + // Drop the lock now we've updated the map. + lock.reset(); + + size_t bytes = header->bytes; if (!header->isNurseryOwned) { - size_t usableBytes = bytes - sizeof(LargeBuffer); - zone->mallocHeapSize.removeBytes(usableBytes, isSweeping); + zone->mallocHeapSize.removeBytes(bytes, isSweeping); } - UnmapPages(header, bytes); + UnmapPages(header->data(), bytes); } #include "js/Printer.h" @@ -2413,13 +2648,13 @@ size_t BufferAllocator::getSizeOfNurseryBuffers() { for (BufferChunk* chunk : mediumMixedChunks.ref()) { for (BufferChunkIter alloc(chunk); !alloc.done(); alloc.next()) { if (alloc->isNurseryOwned) { - bytes += alloc->bytesIncludingHeader() - sizeof(MediumBuffer); + bytes += alloc->allocBytes(); } } } for (const LargeBuffer* buffer : largeNurseryAllocs.ref()) { - bytes += buffer->bytesIncludingHeader - sizeof(LargeBuffer); + bytes += buffer->allocBytes(); } return bytes; @@ -2475,12 +2710,12 @@ void BufferAllocator::getStats(size_t& usedBytes, size_t& freeBytes, } for (const LargeBuffer* buffer : largeNurseryAllocs.ref()) { largeNurseryAllocCount++; - usedBytes += buffer->bytesIncludingHeader - sizeof(LargeBuffer); + usedBytes += buffer->allocBytes(); adminBytes += sizeof(LargeBuffer); } for (const LargeBuffer* buffer : largeTenuredAllocs.ref()) { largeTenuredAllocCount++; - usedBytes += buffer->bytesIncludingHeader - sizeof(LargeBuffer); + usedBytes += buffer->allocBytes(); adminBytes += sizeof(LargeBuffer); } for (const FreeList& freeList : mediumFreeLists.ref()) { diff --git a/js/src/gc/BufferAllocator.h b/js/src/gc/BufferAllocator.h index 2aa65030a88..7ad4bf3ab12 100644 --- a/js/src/gc/BufferAllocator.h +++ b/js/src/gc/BufferAllocator.h @@ -12,6 +12,7 @@ #include "mozilla/Array.h" #include "mozilla/Atomics.h" #include "mozilla/BitSet.h" +#include "mozilla/HashTable.h" #include "mozilla/Maybe.h" #include "mozilla/TimeStamp.h" @@ -198,6 +199,7 @@ class BufferAllocator : public SlimLinkedListElement { public: explicit AutoLock(GCRuntime* gc); explicit AutoLock(BufferAllocator* allocator); + friend class UnlockGuard; }; // A lock guard that is locked only when needed. @@ -250,6 +252,9 @@ class BufferAllocator : public SlimLinkedListElement { using LargeAllocList = SlimLinkedList; + using LargeAllocMap = + mozilla::HashMap>; + enum class State : uint8_t { NotCollecting, Marking, Sweeping }; enum class OwnerKind : uint8_t { Tenured = 0, Nursery, None }; @@ -287,11 +292,15 @@ class BufferAllocator : public SlimLinkedListElement { // List of large tenured-owned buffers. MainThreadData largeTenuredAllocs; + // Map from allocation pointer to buffer metadata for large buffers. + // Access requires holding the mutex during sweeping. + MainThreadOrGCTaskData largeAllocMap; + // Large buffers waiting to be swept. + MainThreadOrGCTaskData largeNurseryAllocsToSweep; MainThreadOrGCTaskData largeTenuredAllocsToSweep; // Large buffers that have been swept. - MainThreadData sweptLargeNurseryAllocs; MutexData sweptLargeTenuredAllocs; // Flag to indicate that swept chunks are available to be merged in the @@ -302,6 +311,11 @@ class BufferAllocator : public SlimLinkedListElement { MainThreadData minorState; MainThreadData majorState; + // Flags to tell the main thread that sweeping has finished and the state + // should be updated. + MutexData minorSweepingFinished; + MutexData majorSweepingFinished; + // A major GC was started while a minor GC was still sweeping. Chunks by the // minor GC will be moved directly to the list of chunks to sweep for the // major GC. This happens for the minor GC at the start of every major GC. @@ -311,9 +325,9 @@ class BufferAllocator : public SlimLinkedListElement { // cleanup will be deferred to the end of the minor sweeping. MainThreadData majorFinishedWhileMinorSweeping; - // Flag to tell the main thread that minor sweeping has finished and - // minorState should be updated. - MutexData minorSweepingFinished; +#ifdef DEBUG + MainThreadData movingGCInProgress; +#endif public: explicit BufferAllocator(JS::Zone* zone); @@ -326,37 +340,32 @@ class BufferAllocator : public SlimLinkedListElement { static inline size_t GetGoodPower2ElementCount(size_t requiredElements, size_t elementSize); static bool IsBufferAlloc(void* alloc); - static size_t GetAllocSize(void* alloc); - static JS::Zone* GetAllocZone(void* alloc); - static bool IsNurseryOwned(void* alloc); - static bool IsMarkedBlack(void* alloc); - static void TraceEdge(JSTracer* trc, Cell* owner, void** bufferp, - const char* name); void* alloc(size_t bytes, bool nurseryOwned); void* allocInGC(size_t bytes, bool nurseryOwned); void* realloc(void* ptr, size_t bytes, bool nurseryOwned); void free(void* ptr); + size_t getAllocSize(void* ptr); + bool isNurseryOwned(void* ptr); void startMinorCollection(MaybeLock& lock); - bool startMinorSweeping(LargeAllocList& largeAllocsToFree); + bool startMinorSweeping(); void sweepForMinorCollection(); - static void FreeLargeAllocs(LargeAllocList& largeAllocsToFree); - void startMajorCollection(MaybeLock& lock); void startMajorSweeping(MaybeLock& lock); void sweepForMajorCollection(bool shouldDecommit); void finishMajorCollection(const AutoLock& lock); + void prepareForMovingGC(); + void fixupAfterMovingGC(); void clearMarkStateAfterBarrierVerification(); - void maybeMergeSweptData(); - void maybeMergeSweptData(MaybeLock& lock); - void mergeSweptData(); - void mergeSweptData(const AutoLock& lock); - bool isEmpty() const; + void traceEdge(JSTracer* trc, Cell* owner, void** bufferp, const char* name); + bool markTenuredAlloc(void* alloc); + bool isMarkedBlack(void* alloc); + // For debugging, used to implement GetMarkInfo. Returns false for allocations // being swept on another thread. bool isPointerWithinMediumOrLargeBuffer(void* ptr); @@ -383,13 +392,16 @@ class BufferAllocator : public SlimLinkedListElement { #endif private: - // GC-internal APIs: - static bool MarkTenuredAlloc(void* alloc); - friend class js::GCMarker; - void markNurseryOwnedAlloc(void* alloc, bool ownerWasTenured); friend class js::Nursery; + void maybeMergeSweptData(); + void maybeMergeSweptData(MaybeLock& lock); + void mergeSweptData(); + void mergeSweptData(const AutoLock& lock); + void abortMajorSweeping(const AutoLock& lock); + void clearAllocatedDuringCollectionState(const AutoLock& lock); + // Small allocation methods: static inline bool IsSmallAllocSize(size_t bytes); @@ -397,6 +409,10 @@ class BufferAllocator : public SlimLinkedListElement { void* allocSmall(size_t bytes, bool nurseryOwned); void* allocSmallInGC(size_t bytes, bool nurseryOwned); + void traceSmallAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name); + void markSmallNurseryOwnedBuffer(SmallBuffer* buffer, bool ownerWasTenured); + bool markSmallTenuredAlloc(void* alloc); static AllocKind AllocKindForSmallAlloc(size_t bytes); @@ -419,8 +435,8 @@ class BufferAllocator : public SlimLinkedListElement { uintptr_t freeEnd, bool shouldDecommit, bool expectUnchanged, FreeLists& freeLists); void freeMedium(void* alloc); - bool growMedium(void* alloc, size_t newBytes); - bool shrinkMedium(void* alloc, size_t newBytes); + bool growMedium(MediumBuffer* header, size_t newBytes); + bool shrinkMedium(MediumBuffer* header, size_t newBytes); FreeRegion* findFollowingFreeRegion(uintptr_t start); FreeRegion* findPrecedingFreeRegion(uintptr_t start); enum class ListPosition { Front, Back }; @@ -432,6 +448,10 @@ class BufferAllocator : public SlimLinkedListElement { uintptr_t newStart); FreeLists* getChunkFreeLists(BufferChunk* chunk); bool isSweepingChunk(BufferChunk* chunk); + void traceMediumAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name); + void markMediumNurseryOwnedBuffer(MediumBuffer* buffer, bool ownerWasTenured); + bool markMediumTenuredAlloc(void* alloc); // Get the size class for an allocation. This rounds up to a class that is // large enough to hold the required size. @@ -448,14 +468,22 @@ class BufferAllocator : public SlimLinkedListElement { static inline bool IsLargeAllocSize(size_t bytes); static bool IsLargeAlloc(void* alloc); - static bool IsLargeAllocMarked(void* alloc); - static bool MarkLargeAlloc(void* alloc); void* allocLarge(size_t bytes, bool nurseryOwned, bool inGC); bool sweepLargeTenured(LargeBuffer* header); void freeLarge(void* alloc); - bool shrinkLarge(void* alloc, size_t newBytes); - void unmapLarge(LargeBuffer* header, bool isSweeping); + bool shrinkLarge(LargeBuffer* header, size_t newBytes); + void unmapLarge(LargeBuffer* header, bool isSweeping, MaybeLock& lock); + void traceLargeAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name); + void markLargeNurseryOwnedBuffer(LargeBuffer* buffer, bool ownerWasTenured); + bool markLargeTenuredBuffer(LargeBuffer* buffer); + bool isLargeAllocMarked(void* alloc); + + // Lookup a large buffer by pointer in the map. + LargeBuffer* lookupLargeBuffer(void* alloc); + LargeBuffer* lookupLargeBuffer(void* alloc, MaybeLock& lock); + bool needLockToAccessBufferMap() const; void updateHeapSize(size_t bytes, bool checkThresholds, bool updateRetainedSize); @@ -494,33 +522,10 @@ struct alignas(CellAlignBytes) MediumBuffer { static MediumBuffer* from(BufferChunk* chunk, uintptr_t offset); void check() const; size_t bytesIncludingHeader() const; + size_t allocBytes() const; void* data(); }; -struct alignas(CellAlignBytes) LargeBuffer - : protected ChunkBase, - public SlimLinkedListElement { - JS::Zone* const zone; - size_t bytesIncludingHeader; - mozilla::Atomic marked; - bool isNurseryOwned; - bool allocatedDuringCollection = false; - -#ifdef DEBUG - uint32_t checkValue = LargeBufferCheckValue; -#endif - - inline LargeBuffer(JS::Zone* zone, size_t bytes, bool nurseryOwned); - - inline void check() const; - - inline bool markAtomic(); - inline void* data(); - bool isPointerWithinAllocation(void* ptr) const; -}; - -static constexpr size_t LargeBufferHeaderSize = sizeof(LargeBuffer); - } // namespace gc } // namespace js diff --git a/js/src/gc/Cell.h b/js/src/gc/Cell.h index 1809f48f6d1..47751203cbe 100644 --- a/js/src/gc/Cell.h +++ b/js/src/gc/Cell.h @@ -901,6 +901,8 @@ class alignas(gc::CellAlignBytes) SmallBuffer : public TenuredCell { // GCRuntime::checkForCompartmentMismatches ends up calling this because it // iterates all GC cells. } + + size_t allocBytes() const; void* data() { return this + 1; } }; template diff --git a/js/src/gc/Compacting.cpp b/js/src/gc/Compacting.cpp index 4250a5a5a55..eec1719c1a2 100644 --- a/js/src/gc/Compacting.cpp +++ b/js/src/gc/Compacting.cpp @@ -388,7 +388,7 @@ bool ArenaLists::relocateArenas(Arena*& relocatedListOut, JS::GCReason reason, clearFreeLists(); if (ShouldRelocateAllArenas(reason)) { - zone_->prepareForCompacting(); + zone_->prepareForMovingGC(); for (auto kind : allocKindsToRelocate) { ArenaList& al = arenaList(kind); Arena* allArenas = al.release(); @@ -409,7 +409,7 @@ bool ArenaLists::relocateArenas(Arena*& relocatedListOut, JS::GCReason reason, return false; } - zone_->prepareForCompacting(); + zone_->prepareForMovingGC(); for (auto kind : allocKindsToRelocate) { if (rangeToRelocate[kind].first) { ArenaList& al = arenaList(kind); @@ -471,13 +471,6 @@ inline void MovingTracer::onEdge(T** thingp, const char* name) { } } -void Zone::prepareForCompacting() { - JS::GCContext* gcx = runtimeFromMainThread()->gcContext(); - - MOZ_ASSERT(!isPreservingCode()); - forceDiscardJitCode(gcx); -} - void GCRuntime::sweepZoneAfterCompacting(MovingTracer* trc, Zone* zone) { MOZ_ASSERT(zone->isGCCompacting()); diff --git a/js/src/gc/GC.cpp b/js/src/gc/GC.cpp index ff89d07ab06..9e4e33177f5 100644 --- a/js/src/gc/GC.cpp +++ b/js/src/gc/GC.cpp @@ -317,6 +317,8 @@ void GCRuntime::verifyAllChunks() { if (currentChunk_) { MOZ_ASSERT(currentChunk_->info.isCurrentChunk); currentChunk_->verify(); + } else { + MOZ_ASSERT(pendingFreeCommittedArenas.ref().IsEmpty()); } } #endif @@ -2271,13 +2273,11 @@ void GCRuntime::queueAllLifoBlocksForFreeAfterMinorGC(LifoAlloc* lifo) { } void GCRuntime::queueBuffersForFreeAfterMinorGC( - Nursery::BufferSet& buffers, Nursery::StringBufferVector& stringBuffers, - Nursery::LargeAllocList& largeAllocs) { + Nursery::BufferSet& buffers, Nursery::StringBufferVector& stringBuffers) { AutoLockHelperThreadState lock; if (!buffersToFreeAfterMinorGC.ref().empty() || - !stringBuffersToReleaseAfterMinorGC.ref().empty() || - !largeBuffersToFreeAfterMinorGC.ref().isEmpty()) { + !stringBuffersToReleaseAfterMinorGC.ref().empty()) { // In the rare case that this hasn't processed the buffers from a previous // minor GC we have to wait here. MOZ_ASSERT(!freeTask.isIdle(lock)); @@ -2289,9 +2289,6 @@ void GCRuntime::queueBuffersForFreeAfterMinorGC( MOZ_ASSERT(stringBuffersToReleaseAfterMinorGC.ref().empty()); std::swap(stringBuffersToReleaseAfterMinorGC.ref(), stringBuffers); - - MOZ_ASSERT(largeBuffersToFreeAfterMinorGC.ref().isEmpty()); - std::swap(largeBuffersToFreeAfterMinorGC.ref(), largeAllocs); } void Realm::destroy(JS::GCContext* gcx) { @@ -4036,7 +4033,6 @@ void GCRuntime::incrementalSlice(SliceBudget& budget, JS::GCReason reason, MOZ_ASSERT(minorGCNumber >= initialMinorGCNumber); if (minorGCNumber == initialMinorGCNumber) { MOZ_ASSERT(nursery().sweepTaskIsIdle()); - waitBackgroundFreeEnd(); } { @@ -4068,6 +4064,7 @@ void GCRuntime::incrementalSlice(SliceBudget& budget, JS::GCReason reason, beginCompactPhase(); } + nursery().joinSweepTask(); if (compactPhase(reason, budget, session) == NotFinished) { break; } diff --git a/js/src/gc/GCRuntime.h b/js/src/gc/GCRuntime.h index 117aada2f68..439e24365bb 100644 --- a/js/src/gc/GCRuntime.h +++ b/js/src/gc/GCRuntime.h @@ -620,8 +620,7 @@ class GCRuntime { void queueUnusedLifoBlocksForFree(LifoAlloc* lifo); void queueAllLifoBlocksForFreeAfterMinorGC(LifoAlloc* lifo); void queueBuffersForFreeAfterMinorGC( - Nursery::BufferSet& buffers, Nursery::StringBufferVector& stringBuffers, - Nursery::LargeAllocList& largeAllocs); + Nursery::BufferSet& buffers, Nursery::StringBufferVector& stringBuffers); // Public here for ReleaseArenaLists and FinalizeTypedArenas. void releaseArena(Arena* arena, const AutoLockGC& lock); @@ -695,8 +694,7 @@ class GCRuntime { bool hasBuffersForBackgroundFree() const { return !lifoBlocksToFree.ref().isEmpty() || !buffersToFreeAfterMinorGC.ref().empty() || - !stringBuffersToReleaseAfterMinorGC.ref().empty() || - !largeBuffersToFreeAfterMinorGC.ref().isEmpty(); + !stringBuffersToReleaseAfterMinorGC.ref().empty(); } // Returns false on failure without raising an exception. @@ -1099,6 +1097,11 @@ class GCRuntime { // accessed without taking the GC lock. MainThreadData currentChunk_; + // Bitmap for arenas in the current chunk that have been freed by background + // sweeping but not yet merged into the chunk's freeCommittedArenas. + GCLockData pendingFreeCommittedArenas; + friend class ArenaChunk; + /* * JSGC_MIN_EMPTY_CHUNK_COUNT * @@ -1227,8 +1230,6 @@ class GCRuntime { HelperThreadLockData buffersToFreeAfterMinorGC; HelperThreadLockData stringBuffersToReleaseAfterMinorGC; - HelperThreadLockData> - largeBuffersToFreeAfterMinorGC; /* The number of the minor GC peformed at the start of major GC. */ MainThreadData initialMinorGCNumber; diff --git a/js/src/gc/Heap.cpp b/js/src/gc/Heap.cpp index f7fede2dc86..1eec140def9 100644 --- a/js/src/gc/Heap.cpp +++ b/js/src/gc/Heap.cpp @@ -355,8 +355,9 @@ void ArenaChunk::releaseArena(GCRuntime* gc, Arena* arena, // The main thread is allocating out of this chunk without holding the // lock. Don't touch any data structures it is using but add the arena to a // pending set. This will be merged back by mergePendingFreeArenas. - MOZ_ASSERT(!pendingFreeCommittedArenas[arenaIndex(arena)]); - pendingFreeCommittedArenas[arenaIndex(arena)] = true; + auto& bitmap = gc->pendingFreeCommittedArenas.ref(); + MOZ_ASSERT(!bitmap[arenaIndex(arena)]); + bitmap[arenaIndex(arena)] = true; return; } @@ -465,7 +466,7 @@ void ArenaChunk::updateCurrentChunkAfterAlloc(GCRuntime* gc) { if (MOZ_UNLIKELY(isFull())) { AutoLockGC lock(gc); - mergePendingFreeArenas(lock); + mergePendingFreeArenas(gc, lock); if (isFull()) { gc->clearCurrentChunk(lock); } @@ -504,9 +505,9 @@ void ArenaChunk::updateFreeCountsAfterFree(GCRuntime* gc, size_t numArenasFreed, void GCRuntime::setCurrentChunk(ArenaChunk* chunk, const AutoLockGC& lock) { MOZ_ASSERT(!currentChunk_); + MOZ_ASSERT(pendingFreeCommittedArenas.ref().IsEmpty()); MOZ_ASSERT(chunk); MOZ_ASSERT(!chunk->info.isCurrentChunk); - MOZ_ASSERT(chunk->pendingFreeCommittedArenas.IsEmpty()); currentChunk_ = chunk; chunk->info.isCurrentChunk = true; // Lock needed here. @@ -520,7 +521,7 @@ void GCRuntime::clearCurrentChunk(const AutoLockGC& lock) { return; } - chunk->mergePendingFreeArenas(lock); + chunk->mergePendingFreeArenas(this, lock); MOZ_ASSERT(chunk->info.isCurrentChunk); chunk->info.isCurrentChunk = false; // Lock needed here. @@ -540,17 +541,18 @@ void GCRuntime::clearCurrentChunk(const AutoLockGC& lock) { availableChunks(lock).push(chunk); } -void ArenaChunk::mergePendingFreeArenas(const AutoLockGC& lock) { +void ArenaChunk::mergePendingFreeArenas(GCRuntime* gc, const AutoLockGC& lock) { MOZ_ASSERT(info.isCurrentChunk); - if (pendingFreeCommittedArenas.IsEmpty()) { + auto& bitmap = gc->pendingFreeCommittedArenas.ref(); + if (bitmap.IsEmpty()) { return; } - MOZ_ASSERT((freeCommittedArenas & pendingFreeCommittedArenas).IsEmpty()); - size_t count = pendingFreeCommittedArenas.Count(); - freeCommittedArenas |= pendingFreeCommittedArenas; - pendingFreeCommittedArenas.ResetAll(); + MOZ_ASSERT((freeCommittedArenas & bitmap).IsEmpty()); + size_t count = bitmap.Count(); + freeCommittedArenas |= bitmap; + bitmap.ResetAll(); info.numArenasFree += count; info.numArenasFreeCommitted += count; @@ -708,7 +710,6 @@ void ChunkPool::verifyChunks() const { for (ArenaChunk* chunk = head_; chunk; chunk = chunk->info.next) { chunk->verify(); MOZ_ASSERT(!chunk->info.isCurrentChunk); - MOZ_ASSERT(chunk->pendingFreeCommittedArenas.IsEmpty()); } } diff --git a/js/src/gc/Heap.h b/js/src/gc/Heap.h index b8a0689a582..d84393ad896 100644 --- a/js/src/gc/Heap.h +++ b/js/src/gc/Heap.h @@ -547,7 +547,7 @@ class ArenaChunk : public ArenaChunkBase { Arena* fetchNextFreeArena(GCRuntime* gc); // Merge arenas freed by background sweeping into the main free arenas bitmap. - void mergePendingFreeArenas(const AutoLockGC& lock); + void mergePendingFreeArenas(GCRuntime* gc, const AutoLockGC& lock); #ifdef DEBUG void verify() const; diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index 3f480dd3696..370bb65d260 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -1657,12 +1657,12 @@ scan_obj: { if (nobj->hasDynamicSlots()) { ObjectSlots* slots = nobj->getSlotsHeader(); - BufferAllocator::MarkTenuredAlloc(slots); + MarkTenuredBuffer(nobj->zone(), slots); } if (nobj->hasDynamicElements()) { void* elements = nobj->getUnshiftedElementsHeader(); - BufferAllocator::MarkTenuredAlloc(elements); + MarkTenuredBuffer(nobj->zone(), elements); } if (!nobj->hasEmptyElements()) { diff --git a/js/src/gc/Nursery.cpp b/js/src/gc/Nursery.cpp index b0b904c24dd..4c85f673ac8 100644 --- a/js/src/gc/Nursery.cpp +++ b/js/src/gc/Nursery.cpp @@ -917,14 +917,12 @@ void* js::Nursery::reallocateBuffer(Zone* zone, Cell* cell, void* oldBuffer, size_t oldBytes, size_t newBytes) { if (!IsInsideNursery(cell)) { MOZ_ASSERT(IsBufferAlloc(oldBuffer)); - MOZ_ASSERT(!ChunkPtrIsInsideNursery(oldBuffer)); - MOZ_ASSERT(!IsNurseryOwned(oldBuffer)); + MOZ_ASSERT(!IsNurseryOwned(zone, oldBuffer)); return ReallocBuffer(zone, oldBuffer, newBytes, false); } - if (!ChunkPtrIsInsideNursery(oldBuffer)) { - MOZ_ASSERT(IsBufferAlloc(oldBuffer)); - MOZ_ASSERT(IsNurseryOwned(oldBuffer)); + if (IsBufferAlloc(oldBuffer)) { + MOZ_ASSERT(IsNurseryOwned(zone, oldBuffer)); MOZ_ASSERT(toSpace.mallocedBufferBytes >= oldBytes); void* newBuffer = ReallocBuffer(zone, oldBuffer, newBytes, true); @@ -1702,8 +1700,7 @@ js::Nursery::CollectionResult js::Nursery::doCollection(AutoGCSession& session, // Sweep malloced buffers. startProfile(ProfileKey::FreeMallocedBuffers); gc->queueBuffersForFreeAfterMinorGC(fromSpace.mallocedBuffers, - stringBuffersToReleaseAfterMinorGC_, - largeAllocsToFreeAfterMinorGC_); + stringBuffersToReleaseAfterMinorGC_); fromSpace.mallocedBufferBytes = 0; endProfile(ProfileKey::FreeMallocedBuffers); @@ -1979,12 +1976,12 @@ Nursery::WasBufferMoved js::Nursery::maybeMoveRawBufferOnPromotion( bool nurseryOwned = IsInsideNursery(owner); void* buffer = *bufferp; - if (!ChunkPtrIsInsideNursery(buffer)) { + if (IsBufferAlloc(buffer)) { // This is an external buffer allocation owned by a nursery GC thing. - MOZ_ASSERT(IsNurseryOwned(buffer)); + Zone* zone = owner->zone(); + MOZ_ASSERT(IsNurseryOwned(zone, buffer)); bool ownerWasTenured = !nurseryOwned; - owner->zone()->bufferAllocator.markNurseryOwnedAlloc(buffer, - ownerWasTenured); + zone->bufferAllocator.markNurseryOwnedAlloc(buffer, ownerWasTenured); if (nurseryOwned) { registerBuffer(buffer, nbytes); } @@ -2014,11 +2011,8 @@ Nursery::WasBufferMoved js::Nursery::maybeMoveRawBufferOnPromotion( } void js::Nursery::sweepBuffers() { - MOZ_ASSERT(largeAllocsToFreeAfterMinorGC_.isEmpty()); - for (ZonesIter zone(runtime(), WithAtoms); !zone.done(); zone.next()) { - if (zone->bufferAllocator.startMinorSweeping( - largeAllocsToFreeAfterMinorGC_)) { + if (zone->bufferAllocator.startMinorSweeping()) { sweepTask->queueAllocatorToSweep(zone->bufferAllocator); } } diff --git a/js/src/gc/Nursery.h b/js/src/gc/Nursery.h index c8decaaf9ea..9820955f783 100644 --- a/js/src/gc/Nursery.h +++ b/js/src/gc/Nursery.h @@ -777,9 +777,6 @@ class Nursery { Vector; StringBufferVector stringBuffersToReleaseAfterMinorGC_; - using LargeAllocList = SlimLinkedList; - LargeAllocList largeAllocsToFreeAfterMinorGC_; - UniquePtr sweepTask; UniquePtr decommitTask; @@ -816,13 +813,6 @@ MOZ_ALWAYS_INLINE bool Nursery::Space::isInside(const void* p) const { return false; } -// Test whether a GC cell or buffer is in the nursery. Equivalent to -// IsInsideNursery but take care not to call this with malloc memory. Faster -// than Nursery::isInside. -MOZ_ALWAYS_INLINE bool ChunkPtrIsInsideNursery(void* ptr) { - return gc::detail::ChunkPtrHasStoreBuffer(ptr); -} - } // namespace js #endif // gc_Nursery_h diff --git a/js/src/gc/Sweeping.cpp b/js/src/gc/Sweeping.cpp index 6aa097592f9..9714572c7c9 100644 --- a/js/src/gc/Sweeping.cpp +++ b/js/src/gc/Sweeping.cpp @@ -430,7 +430,9 @@ void GCRuntime::sweepBackgroundThings(ZoneList& zones) { // Now everything with a non-trivial finalizer has been finalized we can // sweep buffer memory. - // TODO: This could happen in parallel with further arena sweeping. + // + // Note we depend on this happening before the BUFFER alloc kinds in + // BackgroundTrivialFinalizePhase are swept! bool decommit = shouldDecommit() && DecommitEnabled(); zone->bufferAllocator.sweepForMajorCollection(decommit); @@ -601,9 +603,6 @@ void GCRuntime::freeFromBackgroundThread(AutoLockHelperThreadState& lock) { Nursery::StringBufferVector stringBuffers; std::swap(stringBuffers, stringBuffersToReleaseAfterMinorGC.ref()); - SlimLinkedList largeBuffers; - std::swap(largeBuffers, largeBuffersToFreeAfterMinorGC.ref()); - AutoUnlockHelperThreadState unlock(lock); lifoBlocks.freeAll(); @@ -619,8 +618,6 @@ void GCRuntime::freeFromBackgroundThread(AutoLockHelperThreadState& lock) { for (auto* buffer : stringBuffers) { buffer->Release(); } - - BufferAllocator::FreeLargeAllocs(largeBuffers); } while (hasBuffersForBackgroundFree()); } diff --git a/js/src/gc/Tracer.h b/js/src/gc/Tracer.h index 6e7e2885a03..74b34acda77 100644 --- a/js/src/gc/Tracer.h +++ b/js/src/gc/Tracer.h @@ -7,8 +7,8 @@ #ifndef js_Tracer_h #define js_Tracer_h +#include "gc/Allocator.h" #include "gc/Barrier.h" -#include "gc/BufferAllocator.h" #include "gc/TraceKind.h" #include "js/HashTable.h" #include "js/TracingAPI.h" @@ -335,7 +335,7 @@ template void TraceBufferEdge(JSTracer* trc, gc::Cell* owner, T** bufferp, const char* name) { void** ptrp = reinterpret_cast(bufferp); - gc::BufferAllocator::TraceEdge(trc, owner, ptrp, name); + gc::TraceBufferEdgeInternal(trc, owner, ptrp, name); } // As below but with manual barriers. diff --git a/js/src/gc/Zone.cpp b/js/src/gc/Zone.cpp index 4cd60f9768c..7c1d922f03b 100644 --- a/js/src/gc/Zone.cpp +++ b/js/src/gc/Zone.cpp @@ -602,9 +602,20 @@ Zone* Zone::nextZone() const { return listNext_; } +void Zone::prepareForMovingGC() { + JS::GCContext* gcx = runtimeFromMainThread()->gcContext(); + + MOZ_ASSERT(!isPreservingCode()); + forceDiscardJitCode(gcx); + + // We must always call fixupAfterMovingGC after this point. + bufferAllocator.prepareForMovingGC(); +} + void Zone::fixupAfterMovingGC() { ZoneAllocator::fixupAfterMovingGC(); shapeZone().fixupPropMapShapeTableAfterMovingGC(); + bufferAllocator.fixupAfterMovingGC(); } void Zone::purgeAtomCache() { diff --git a/js/src/gc/Zone.h b/js/src/gc/Zone.h index b8ee8ca80b8..be34302299a 100644 --- a/js/src/gc/Zone.h +++ b/js/src/gc/Zone.h @@ -683,8 +683,6 @@ class Zone : public js::ZoneAllocator, public js::gc::GraphNodeBase { return numRealmsWithAllocMetadataBuilder_ > 0; } - void prepareForCompacting(); - void traceRootsInMajorGC(JSTracer* trc); void sweepAfterMinorGC(JSTracer* trc); @@ -731,7 +729,9 @@ class Zone : public js::ZoneAllocator, public js::gc::GraphNodeBase { void traceWeakCCWEdges(JSTracer* trc); static void fixupAllCrossCompartmentWrappersAfterMovingGC(JSTracer* trc); + void prepareForMovingGC(); void fixupAfterMovingGC(); + void fixupScriptMapsAfterMovingGC(JSTracer* trc); void setNurseryAllocFlags(bool allocObjects, bool allocStrings, diff --git a/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-cloning.js b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-cloning.js new file mode 100644 index 00000000000..287198c783c --- /dev/null +++ b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-cloning.js @@ -0,0 +1,12 @@ +// |jit-test| skip-if: !wasmThreadsEnabled() || !('toResizableBuffer' in WebAssembly.Memory.prototype) + +// When serializing and deserializing a SAB extracted from a memory, the length +// of the SAB should not change even if the memory was grown after serialization +// and before deserialization. + +let mem = new WebAssembly.Memory({initial: 2, maximum: 4, shared: true}); +let buf = mem.toResizableBuffer(); +let clonedbuf = serialize(buf, [], {SharedArrayBuffer: 'allow'}); +mem.grow(1); +let buf2 = deserialize(clonedbuf, {SharedArrayBuffer: 'allow'}); +assertEq(buf.byteLength, buf2.byteLength); diff --git a/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-shared.js b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-shared.js new file mode 100644 index 00000000000..09403ebacbb --- /dev/null +++ b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-shared.js @@ -0,0 +1,127 @@ +// |jit-test| skip-if: !('toResizableBuffer' in WebAssembly.Memory.prototype) + +let mem = new WebAssembly.Memory({initial: 20, maximum: 50, shared: true}); + +// Utils for testing + +let ins = wasmEvalText(`(module + (import "" "mem" (memory 20 50 shared)) + (func (export "check") (param i32 i32 i32) (result i32) + block + loop + local.get 0 + i32.load + local.get 2 + i32.eq + i32.eqz + br_if 1 + + local.get 1 + i32.const 1 + i32.sub + local.set 1 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + br_if 0 + i32.const 1 + return + end + end + i32.const 0 + ) + (func (export "fill") (param i32 i32 i32) + loop + local.get 0 + local.get 2 + i32.store + + local.get 1 + i32.const 1 + i32.sub + local.set 1 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + br_if 0 + end + ) +)`, {"": {mem,}}); + +function check(off, count, value) { + const arr = new Int32Array(mem.buffer); + for (let i = 0; i < count; i++) { + assertEq(arr[(off >> 2) + i], value); + } +} +function fill(off, count, value) { + const arr = new Int32Array(mem.buffer); + for (let i = 0; i < count; i++) { + arr[i] = value; + } +} + +fill(0, 10, 1); +assertEq(ins.exports.check(0, 10, 1), 1); + +// Convert to growable array, back to fixed-length, again to growable, +// and attempt to resize using JS. + +let ab = mem.buffer; +assertEq(ab.growable, false); + +// Make .buffer growable, detaching the old one. +let rab = mem.toResizableBuffer(); +assertEq(rab.growable, true); +assertEq(mem.buffer, rab); +assertEq(rab.maxByteLength, 50 << 16); + +assertEq(ins.exports.check(0, 10, 1), 1); +ins.exports.fill(0, 10, 3); +check(0, 10, 3); + +// We can go back if we choose. +let ab2 = mem.toFixedLengthBuffer(); +assertEq(ab2.growable, false); +assertEq(mem.buffer, ab2); +assertEq(ab2 !== ab, true); +assertEq(ab2.maxByteLength, 20 << 16); + +assertEq(ins.exports.check(0, 10, 3), 1); +ins.exports.fill(0, 10, 2); +check(0, 10, 2); + +assertThrowsInstanceOf( + () => ins.exports.check(20 * 65536 - 4, 2, 0), WebAssembly.RuntimeError); +ins.exports.fill(20 * 65536 - 4, 1, 20); + +// Let's go back to growable. Memory#grow no longer detaches .buffer when it's growable. +rab = mem.toResizableBuffer(); +let oldLen = rab.byteLength; +mem.grow(8); +assertEq(rab.byteLength, oldLen + (8 * 65536)) +assertEq(rab.maxByteLength, 50 << 16); + +ins.exports.check(20 * 65536 - 4, 1, 20); +ins.exports.check(20 * 65536, 1, 0); +assertThrowsInstanceOf( + () => ins.exports.check(28 * 65536 - 4, 2, 0), WebAssembly.RuntimeError); + +assertEq(ins.exports.check(0, 10, 2), 1); +ins.exports.fill(0, 10, 5); +check(0, 10, 5); + +// Try to resize JS way. +rab.grow(65536 * 30); +assertEq(rab.byteLength, 30 * 65536); +ins.exports.fill(30 * 65536 - 10*4, 10, 6); +check(30 * 65536 - 10 * 4, 10, 6); + +// RAB#resize throws when trying to shrink or grow by non-page multiples +// for WebAssembly.Memory-vended RABs. +assertThrowsInstanceOf(() => rab.grow(rab.byteLength - 65536), RangeError); +assertThrowsInstanceOf(() => rab.grow(rab.byteLength + 10), RangeError); diff --git a/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer.js b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer.js new file mode 100644 index 00000000000..d52d18989b8 --- /dev/null +++ b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer.js @@ -0,0 +1,135 @@ +// |jit-test| skip-if: !('toResizableBuffer' in WebAssembly.Memory.prototype) + +let mem = new WebAssembly.Memory({initial: 20, maximum: 50}); + +// Utils for testing + +let ins = wasmEvalText(`(module + (import "" "mem" (memory 20 50)) + (func (export "check") (param i32 i32 i32) (result i32) + block + loop + local.get 0 + i32.load + local.get 2 + i32.eq + i32.eqz + br_if 1 + + local.get 1 + i32.const 1 + i32.sub + local.set 1 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + br_if 0 + i32.const 1 + return + end + end + i32.const 0 + ) + (func (export "fill") (param i32 i32 i32) + loop + local.get 0 + local.get 2 + i32.store + + local.get 1 + i32.const 1 + i32.sub + local.set 1 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + br_if 0 + end + ) +)`, {"": {mem,}}); + +function check(off, count, value) { + const arr = new Int32Array(mem.buffer); + for (let i = 0; i < count; i++) { + assertEq(arr[(off >> 2) + i], value); + } +} +function fill(off, count, value) { + const arr = new Int32Array(mem.buffer); + for (let i = 0; i < count; i++) { + arr[i] = value; + } +} + +fill(0, 10, 1); +assertEq(ins.exports.check(0, 10, 1), 1); + +// Convert to resizable array, back to fixed-length, again to resizable, +// and attempt to resize using JS. + +let ab = mem.buffer; +assertEq(ab.resizable, false); + +// Make .buffer resizable, detaching the old one. +let rab = mem.toResizableBuffer(); +assertEq(rab.resizable, true); +assertEq(mem.buffer, rab); +assertEq(ab.detached, true); +assertEq(rab.maxByteLength, 50 << 16); + +assertEq(ins.exports.check(0, 10, 1), 1); +ins.exports.fill(0, 10, 3); +check(0, 10, 3); + +// We can go back if we choose. +let ab2 = mem.toFixedLengthBuffer(); +assertEq(ab2.resizable, false); +assertEq(mem.buffer, ab2); +assertEq(ab2 !== ab, true); +assertEq(rab.detached, true); +assertEq(ab2.maxByteLength, 20 << 16); + +assertEq(ins.exports.check(0, 10, 3), 1); +ins.exports.fill(0, 10, 2); +check(0, 10, 2); + +assertThrowsInstanceOf( + () => ins.exports.check(20 * 65536 - 4, 2, 0), WebAssembly.RuntimeError); +ins.exports.fill(20 * 65536 - 4, 1, 20); + +// Let's go back to resizable. Memory#grow no longer detaches .buffer when it's resizable. +rab = mem.toResizableBuffer(); +let oldLen = rab.byteLength; +mem.grow(8); +assertEq(rab.detached, false); +assertEq(rab.byteLength, oldLen + (8 * 65536)) +assertEq(rab.maxByteLength, 50 << 16); + +ins.exports.check(20 * 65536 - 4, 1, 20); +ins.exports.check(20 * 65536, 1, 0); +assertThrowsInstanceOf( + () => ins.exports.check(28 * 65536 - 4, 2, 0), WebAssembly.RuntimeError); + +assertEq(ins.exports.check(0, 10, 2), 1); +ins.exports.fill(0, 10, 5); +check(0, 10, 5); + +// Try to resize JS way. +rab.resize(65536 * 30); +assertEq(rab.byteLength, 30 * 65536); +ins.exports.fill(30 * 65536 - 10*4, 10, 6); +check(30 * 65536 - 10 * 4, 10, 6); + +// RAB#resize throws when trying to shrink or grow by non-page multiples +// for WebAssembly.Memory-vended RABs. +assertThrowsInstanceOf(() => rab.resize(rab.byteLength - 65536), RangeError); +assertThrowsInstanceOf(() => rab.resize(rab.byteLength + 10), RangeError); + +// No allow to make buffer resizable when max in not specified. + +mem = new WebAssembly.Memory({initial: 20}); +assertThrowsInstanceOf(() => mem.toResizableBuffer(), TypeError); diff --git a/js/src/jit/ABIFunctionList-inl.h b/js/src/jit/ABIFunctionList-inl.h index c91f378a343..d00157ee450 100644 --- a/js/src/jit/ABIFunctionList-inl.h +++ b/js/src/jit/ABIFunctionList-inl.h @@ -7,6 +7,7 @@ #ifndef jit_ABIFunctionList_inl_h #define jit_ABIFunctionList_inl_h +#include "mozilla/MacroArgs.h" // MOZ_CONCAT #include "mozilla/SIMD.h" // mozilla::SIMD::memchr{,2x}{8,16} #include "jslibmath.h" // js::NumberMod @@ -97,108 +98,108 @@ namespace jit { # define ABIFUNCTION_FUZZILLI_LIST(_) #endif -#define ABIFUNCTION_LIST(_) \ - ABIFUNCTION_JS_GC_PROBES_LIST(_) \ - ABIFUNCTION_JS_CODEGEN_ARM_LIST(_) \ - ABIFUNCTION_WASM_CODEGEN_DEBUG_LIST(_) \ - _(js::ArgumentsObject::finishForIonPure) \ - _(js::ArgumentsObject::finishInlineForIonPure) \ - _(js::ArrayShiftMoveElements) \ - _(js::ArraySortData::sortArrayWithComparator) \ - _(js::ArraySortData::sortTypedArrayWithComparator) \ - _(js::ArraySortFromJit) \ - _(js::ecmaAtan2) \ - _(js::ecmaHypot) \ - _(js::ecmaPow) \ - _(js::EmulatesUndefined) \ - _(js::EmulatesUndefinedCheckFuse) \ - _(js::ExecuteRegExpAtomRaw) \ - _(js::hypot3) \ - _(js::hypot4) \ - _(js::Interpret) \ - _(js::Int32ToStringPure) \ - _(js::irregexp::CaseInsensitiveCompareNonUnicode) \ - _(js::irregexp::CaseInsensitiveCompareUnicode) \ - _(js::irregexp::GrowBacktrackStack) \ - _(js::irregexp::IsCharacterInRangeArray) \ - _(js::jit::AllocateAndInitTypedArrayBuffer) \ - _(js::jit::AllocateBigIntNoGC) \ - _(js::jit::AllocateFatInlineString) \ - _(js::jit::AllocateDependentString) \ - _(js::jit::AssertMapObjectHash) \ - _(js::jit::AssertPropertyLookup) \ - _(js::jit::AssertSetObjectHash) \ - _(js::jit::AssertValidBigIntPtr) \ - _(js::jit::AssertValidObjectPtr) \ - _(js::jit::AssertValidStringPtr) \ - _(js::jit::AssertValidSymbolPtr) \ - _(js::jit::AssertValidValue) \ - _(js::jit::AssumeUnreachable) \ - _(js::jit::AtomicsStore64) \ - _(js::jit::AtomizeStringNoGC) \ - _(js::jit::Bailout) \ - _(js::jit::BaselineScript::OSREntryForFrame) \ - _(js::jit::BigIntNumberEqual) \ - _(js::jit::BigIntNumberEqual) \ - _(js::jit::BigIntNumberCompare) \ - _(js::jit::NumberBigIntCompare) \ - _(js::jit::NumberBigIntCompare) \ - _(js::jit::BigIntNumberCompare) \ - _(js::jit::DateFillLocalTimeSlots) \ - _(js::jit::EqualStringsHelperPure) \ - _(js::jit::FinishBailoutToBaseline) \ - _(js::jit::Float16ToFloat32) \ - _(js::jit::Float32ToFloat16) \ - _(js::jit::FrameIsDebuggeeCheck) \ - _(js::jit::GetContextSensitiveInterpreterStub) \ - _(js::jit::GetIndexFromString) \ - _(js::jit::GetInt32FromStringPure) \ - _(js::jit::GetNativeDataPropertyPure) \ - _(js::jit::GetNativeDataPropertyPureWithCacheLookup) \ - _(js::jit::GetNativeDataPropertyByValuePure) \ - _(js::jit::GlobalHasLiveOnDebuggerStatement) \ - _(js::jit::HandleCodeCoverageAtPC) \ - _(js::jit::HandleCodeCoverageAtPrologue) \ - _(js::jit::HandleException) \ - _(js::jit::HasNativeDataPropertyPure) \ - _(js::jit::HasNativeDataPropertyPure) \ - _(js::jit::HasNativeElementPure) \ - _(js::jit::InitBaselineFrameForOsr) \ - _(js::jit::InvalidationBailout) \ - _(js::jit::InvokeFromInterpreterStub) \ - _(js::jit::LazyLinkTopActivation) \ - _(js::jit::LinearizeForCharAccessPure) \ - _(js::jit::ObjectHasGetterSetterPure) \ - _(js::jit::ObjectIsCallable) \ - _(js::jit::ObjectIsConstructor) \ - _(js::jit::PostGlobalWriteBarrier) \ - _(js::jit::PostWriteBarrier) \ - _(js::jit::PostWriteElementBarrier) \ - _(js::jit::Printf0) \ - _(js::jit::Printf1) \ - _(js::jit::StringFromCharCodeNoGC) \ - _(js::jit::StringTrimEndIndex) \ - _(js::jit::StringTrimStartIndex) \ - _(js::jit::TypeOfNameObject) \ - _(js::jit::TypeOfEqObject) \ - _(js::jit::WrapObjectPure) \ - ABIFUNCTION_FUZZILLI_LIST(_) \ - _(js::MapIteratorObject::next) \ - _(js::NativeObject::addDenseElementPure) \ - _(js::NativeObject::growSlotsPure) \ - _(js::NumberMod) \ - _(js::NumberToStringPure) \ - _(js::ObjectClassToString) \ - _(js::powi) \ - _(js::ProxyGetProperty) \ - _(js::RoundFloat16) \ - _(js::SetIteratorObject::next) \ - _(js::StringToNumberPure) \ - _(js::TypedArraySortFromJit) \ - _(js::TypeOfObject) \ - _(mozilla::SIMD::memchr16) \ - _(mozilla::SIMD::memchr2x16) \ - _(mozilla::SIMD::memchr2x8) \ +#define ABIFUNCTION_LIST(_) \ + ABIFUNCTION_JS_GC_PROBES_LIST(_) \ + ABIFUNCTION_JS_CODEGEN_ARM_LIST(_) \ + ABIFUNCTION_WASM_CODEGEN_DEBUG_LIST(_) \ + _(js::ArgumentsObject::finishForIonPure) \ + _(js::ArgumentsObject::finishInlineForIonPure) \ + _(js::ArrayShiftMoveElements) \ + _(js::ArraySortData::sortArrayWithComparator) \ + _(js::ArraySortData::sortTypedArrayWithComparator) \ + _(js::ArraySortFromJit) \ + _(js::ecmaAtan2) \ + _(js::ecmaHypot) \ + _(js::ecmaPow) \ + _(js::EmulatesUndefined) \ + _(js::EmulatesUndefinedCheckFuse) \ + _(js::ExecuteRegExpAtomRaw) \ + _(js::hypot3) \ + _(js::hypot4) \ + _(js::Interpret) \ + _(js::Int32ToStringPure) \ + _(js::irregexp::CaseInsensitiveCompareNonUnicode) \ + _(js::irregexp::CaseInsensitiveCompareUnicode) \ + _(js::irregexp::GrowBacktrackStack) \ + _(js::irregexp::IsCharacterInRangeArray) \ + _(js::jit::AllocateAndInitTypedArrayBuffer) \ + _(js::jit::AllocateBigIntNoGC) \ + _(js::jit::AllocateFatInlineString) \ + _(js::jit::AllocateDependentString) \ + _(js::jit::AssertMapObjectHash) \ + _(js::jit::AssertPropertyLookup) \ + _(js::jit::AssertSetObjectHash) \ + _(js::jit::AssertValidBigIntPtr) \ + _(js::jit::AssertValidObjectPtr) \ + _(js::jit::AssertValidStringPtr) \ + _(js::jit::AssertValidSymbolPtr) \ + _(js::jit::AssertValidValue) \ + _(js::jit::AssumeUnreachable) \ + _(js::jit::AtomicsStore64) \ + _(js::jit::AtomizeStringNoGC) \ + _(js::jit::Bailout) \ + _(js::jit::BaselineScript::OSREntryForFrame) \ + _(js::jit::BigIntNumberEqual) \ + _(js::jit::BigIntNumberEqual) \ + _(js::jit::BigIntNumberCompare) \ + _(js::jit::NumberBigIntCompare) \ + _(js::jit::NumberBigIntCompare) \ + _(js::jit::BigIntNumberCompare) \ + _(js::jit::DateFillLocalTimeSlots) \ + _(js::jit::EqualStringsHelperPure) \ + _(js::jit::FinishBailoutToBaseline) \ + _(js::jit::Float16ToFloat32) \ + _(js::jit::Float32ToFloat16) \ + _(js::jit::FrameIsDebuggeeCheck) \ + _(js::jit::GetContextSensitiveInterpreterStub) \ + _(js::jit::GetIndexFromString) \ + _(js::jit::GetInt32FromStringPure) \ + _(js::jit::GetNativeDataPropertyPure) \ + _(js::jit::GetNativeDataPropertyPureWithCacheLookup) \ + _(js::jit::GetNativeDataPropertyByValuePure) \ + _(js::jit::GlobalHasLiveOnDebuggerStatement) \ + _(js::jit::HandleCodeCoverageAtPC) \ + _(js::jit::HandleCodeCoverageAtPrologue) \ + _(js::jit::HandleException) \ + _(js::jit::HasNativeDataPropertyPure) \ + _(js::jit::HasNativeDataPropertyPure) \ + _(js::jit::HasNativeElementPure) \ + _(js::jit::InitBaselineFrameForOsr) \ + _(js::jit::InvalidationBailout) \ + _(js::jit::InvokeFromInterpreterStub) \ + _(js::jit::LazyLinkTopActivation) \ + _(js::jit::LinearizeForCharAccessPure) \ + _(js::jit::ObjectHasGetterSetterPure) \ + _(js::jit::ObjectIsCallable) \ + _(js::jit::ObjectIsConstructor) \ + _(js::jit::PostGlobalWriteBarrier) \ + _(js::jit::PostWriteBarrier) \ + _(js::jit::PostWriteElementBarrier) \ + _(js::jit::Printf0) \ + _(js::jit::Printf1) \ + _(js::jit::StringFromCharCodeNoGC) \ + _(js::jit::StringTrimEndIndex) \ + _(js::jit::StringTrimStartIndex) \ + _(js::jit::TypeOfNameObject) \ + _(js::jit::TypeOfEqObject) \ + _(js::jit::WrapObjectPure) \ + ABIFUNCTION_FUZZILLI_LIST(_) \ + _(js::MapIteratorObject::next) \ + _(js::NativeObject::addDenseElementPure) \ + _(js::NativeObject::growSlotsPure) \ + _(js::NumberMod) \ + _(js::NumberToStringPure) \ + _(js::ObjectClassToString) \ + _(js::powi) \ + _(js::ProxyGetProperty) \ + _(js::RoundFloat16) \ + _(js::SetIteratorObject::next) \ + _(js::StringToNumberPure) \ + _(js::TypedArraySortFromJit) \ + _(js::TypeOfObject) \ + _(mozilla::SIMD::memchr16) \ + _(mozilla::SIMD::memchr2x16) \ + _(mozilla::SIMD::memchr2x8) \ _(mozilla::SIMD::memchr8) // List of all ABI functions to be used with callWithABI, which are @@ -241,19 +242,17 @@ namespace jit { # pragma GCC diagnostic ignored "-Wignored-attributes" #endif -// Note: the use of ::fp instead of fp is intentional to enforce use of -// fully-qualified names in the list above. -#define DEF_TEMPLATE(fp) \ - template <> \ - struct ABIFunctionData { \ - static constexpr bool registered = true; \ +#define DEF_TEMPLATE(fp) \ + template <> \ + struct ABIFunctionData { \ + static constexpr bool registered = true; \ }; ABIFUNCTION_LIST(DEF_TEMPLATE) #undef DEF_TEMPLATE #define DEF_TEMPLATE(fp, ...) \ template <> \ - struct ABIFunctionData<__VA_ARGS__, ::fp> { \ + struct ABIFunctionData<__VA_ARGS__, fp> { \ static constexpr bool registered = true; \ }; ABIFUNCTION_AND_TYPE_LIST(DEF_TEMPLATE) @@ -275,4 +274,20 @@ ABIFUNCTIONSIG_LIST(DEF_TEMPLATE) } // namespace jit } // namespace js +// Make sure that all names are fully qualified (or at least, are resolvable +// within the toplevel namespace). +// +// Previously this was accomplished just by using `::fp` to force resolution +// within the toplevel namespace, but (1) that prevented using templated +// functions with more than one parameter (eg `void foo`) because the +// macro split on the comma and wrapping it in parens doesn't work because +// `::(foo)` is invalid; and (2) that would only check the function name itself, +// not eg template parameters. +namespace check_fully_qualified { +#define CHECK_NS_VISIBILITY(fp) \ + [[maybe_unused]] static constexpr decltype(&fp) MOZ_CONCAT(fp_, __COUNTER__) = nullptr; +ABIFUNCTION_LIST(CHECK_NS_VISIBILITY) +#undef CHECK_NS_VISIBILITY +} // namespace check_fully_qualified + #endif // jit_VMFunctionList_inl_h diff --git a/js/src/jit/VMFunctionList-inl.h b/js/src/jit/VMFunctionList-inl.h index 361789178ae..62abf380543 100644 --- a/js/src/jit/VMFunctionList-inl.h +++ b/js/src/jit/VMFunctionList-inl.h @@ -7,6 +7,8 @@ #ifndef jit_VMFunctionList_inl_h #define jit_VMFunctionList_inl_h +#include "mozilla/MacroArgs.h" // MOZ_CONCAT + #include "builtin/Eval.h" #include "builtin/ModuleObject.h" // js::GetOrCreateModuleMetaObject #include "builtin/Object.h" // js::ObjectCreateWithTemplate @@ -127,7 +129,7 @@ namespace jit { _(CloneRegExpObject, js::CloneRegExpObject) \ _(CloseIterOperation, js::CloseIterOperation) \ _(CodePointAt, js::jit::CodePointAt) \ - _(ConcatStrings, js::ConcatStrings) \ + _(ConcatStrings, js::ConcatStrings) \ _(CreateAsyncFromSyncIterator, js::CreateAsyncFromSyncIterator) \ _(CreateBigIntFromInt32, js::jit::CreateBigIntFromInt32) \ _(CreateBigIntFromInt64, js::jit::CreateBigIntFromInt64) \ @@ -218,8 +220,8 @@ namespace jit { _(InitFunctionEnvironmentObjects, js::jit::InitFunctionEnvironmentObjects) \ _(InitPropGetterSetterOperation, js::InitPropGetterSetterOperation) \ _(InitRestParameter, js::jit::InitRestParameter) \ - _(Int32ToString, js::Int32ToString) \ - _(Int32ToStringWithBase, js::Int32ToStringWithBase) \ + _(Int32ToString, js::Int32ToString) \ + _(Int32ToStringWithBase, js::Int32ToStringWithBase) \ _(InterpretResume, js::jit::InterpretResume) \ _(InterruptCheck, js::jit::InterruptCheck) \ _(InvokeFunction, js::jit::InvokeFunction) \ @@ -283,7 +285,7 @@ namespace jit { js::NewTypedArrayWithTemplateAndLength) \ _(NormalSuspend, js::jit::NormalSuspend) \ _(NumberParseInt, js::NumberParseInt) \ - _(NumberToString, js::NumberToString) \ + _(NumberToString, js::NumberToString) \ _(ObjectCreateWithTemplate, js::ObjectCreateWithTemplate) \ _(ObjectKeys, js::jit::ObjectKeys) \ _(ObjectKeysLength, js::jit::ObjectKeysLength) \ @@ -342,8 +344,9 @@ namespace jit { _(StringTrimEnd, js::StringTrimEnd) \ _(StringTrimStart, js::StringTrimStart) \ _(StringsCompareGreaterThanOrEquals, \ - js::jit::StringsCompare) \ - _(StringsCompareLessThan, js::jit::StringsCompare) \ + js::jit::StringsCompare) \ + _(StringsCompareLessThan, \ + js::jit::StringsCompare) \ _(StringsEqual, js::jit::StringsEqual) \ _(StringsNotEqual, js::jit::StringsEqual) \ _(SubstringKernel, js::SubstringKernel) \ @@ -358,7 +361,7 @@ namespace jit { _(ThrowUninitializedThis, js::ThrowUninitializedThis) \ _(ThrowWithStackOperation, js::ThrowWithStackOperation) \ _(ToBigInt, js::ToBigInt) \ - _(ToStringSlow, js::ToStringSlow) \ + _(ToStringSlow, js::ToStringSlow) \ _(ValueToIterator, js::ValueToIterator) \ _(VarEnvironmentObjectCreateWithoutEnclosing, \ js::VarEnvironmentObject::createWithoutEnclosing) @@ -384,7 +387,7 @@ struct VMFunctionToId; // Error here? Update VMFUNCTION_LIST? // fully-qualified names in the list above. #define DEF_TEMPLATE(name, fp, ...) \ template <> \ - struct VMFunctionToId { \ + struct VMFunctionToId { \ static constexpr VMFunctionId id = VMFunctionId::name; \ }; VMFUNCTION_LIST(DEF_TEMPLATE) @@ -397,4 +400,13 @@ VMFUNCTION_LIST(DEF_TEMPLATE) } // namespace jit } // namespace js +// Make sure that all names are fully qualified (or at least, are resolvable +// within the toplevel namespace). +namespace check_fully_qualified { +#define CHECK_NS_VISIBILITY(name, fp, ...) \ + [[maybe_unused]] static constexpr decltype(&fp) MOZ_CONCAT(fp_, __COUNTER__) = nullptr; +VMFUNCTION_LIST(CHECK_NS_VISIBILITY) +#undef CHECK_NS_VISIBILITY +} // namespace check_fully_qualified + #endif // jit_VMFunctionList_inl_h diff --git a/js/src/jit/VMFunctions.cpp b/js/src/jit/VMFunctions.cpp index 6e8cec03b3d..fcaf1b08c84 100644 --- a/js/src/jit/VMFunctions.cpp +++ b/js/src/jit/VMFunctions.cpp @@ -368,7 +368,7 @@ struct VMFunctionDataHelper // Generate VMFunctionData array. static constexpr VMFunctionData vmFunctions[] = { #define DEF_VMFUNCTION(name, fp, valuesToPop...) \ - VMFunctionDataHelper(#name, PopValues(valuesToPop)), + VMFunctionDataHelper(#name, PopValues(valuesToPop)), VMFUNCTION_LIST(DEF_VMFUNCTION) #undef DEF_VMFUNCTION }; @@ -381,7 +381,7 @@ static constexpr VMFunctionData vmFunctions[] = { // in VMFunctionData because there's no good way to cast them to void* in // constexpr code. Compilers are smart enough to treat the const array below as // constexpr. -#define DEF_VMFUNCTION(name, fp, ...) (void*)(::fp), +#define DEF_VMFUNCTION(name, fp, ...) (void*)(fp), static void* const vmFunctionTargets[] = {VMFUNCTION_LIST(DEF_VMFUNCTION)}; #undef DEF_VMFUNCTION diff --git a/js/src/jsapi-tests/testGCAllocator.cpp b/js/src/jsapi-tests/testGCAllocator.cpp index 6704aa6bd7b..d8fb85eea2d 100644 --- a/js/src/jsapi-tests/testGCAllocator.cpp +++ b/js/src/jsapi-tests/testGCAllocator.cpp @@ -397,7 +397,9 @@ static size_t SomeAllocSizes[] = {16, 255 * 1024, 256 * 1024, 600 * 1024, - 3 * 1024 * 1024}; + 1 * 1024 * 1024, + 3 * 1024 * 1024, + 10 * 1024 * 1024}; static void WriteAllocData(void* alloc, size_t bytes) { auto* data = reinterpret_cast(alloc); @@ -503,23 +505,25 @@ BEGIN_TEST(testBufferAllocator_API) { } CHECK(GetGoodAllocSize(goodSize) == goodSize); + // Check we don't waste space requesting 1MB aligned sizes. + if (requestSize >= ChunkSize) { + CHECK(goodSize == RoundUp(requestSize, ChunkSize)); + } + for (bool nurseryOwned : {true, false}) { void* alloc = AllocBuffer(zone, requestSize, nurseryOwned); CHECK(alloc); CHECK(IsBufferAlloc(alloc)); - CHECK(!ChunkPtrIsInsideNursery(alloc)); - size_t actualSize = GetAllocSize(alloc); + size_t actualSize = GetAllocSize(zone, alloc); CHECK(actualSize == GetGoodAllocSize(requestSize)); - CHECK(GetAllocZone(alloc) == zone); - - CHECK(IsNurseryOwned(alloc) == nurseryOwned); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); WriteAllocData(alloc, actualSize); CHECK(CheckAllocData(alloc, actualSize)); - CHECK(!IsBufferAllocMarkedBlack(alloc)); + CHECK(!IsBufferAllocMarkedBlack(zone, alloc)); CHECK(cx->runtime()->gc.isPointerWithinBufferAlloc(alloc)); @@ -573,9 +577,8 @@ BEGIN_TEST(testBufferAllocator_realloc) { void* alloc = ReallocBuffer(zone, nullptr, requestSize, nurseryOwned); CHECK(alloc); CHECK(IsBufferAlloc(alloc)); - CHECK(!ChunkPtrIsInsideNursery(alloc)); - CHECK(IsNurseryOwned(alloc) == nurseryOwned); - size_t actualSize = GetAllocSize(alloc); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); + size_t actualSize = GetAllocSize(zone, alloc); WriteAllocData(alloc, actualSize); holder->setBuffer(alloc); @@ -584,23 +587,23 @@ BEGIN_TEST(testBufferAllocator_realloc) { alloc = ReallocBuffer(zone, alloc, requestSize, nurseryOwned); CHECK(alloc); CHECK(alloc == prev); - CHECK(actualSize == GetAllocSize(alloc)); - CHECK(IsNurseryOwned(alloc) == nurseryOwned); + CHECK(actualSize == GetAllocSize(zone, alloc)); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); CHECK(CheckAllocData(alloc, actualSize)); // Grow. size_t newSize = requestSize + requestSize / 2; alloc = ReallocBuffer(zone, alloc, newSize, nurseryOwned); CHECK(alloc); - CHECK(IsNurseryOwned(alloc) == nurseryOwned); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); CHECK(CheckAllocData(alloc, actualSize)); // Shrink. newSize = newSize / 2; alloc = ReallocBuffer(zone, alloc, newSize, nurseryOwned); CHECK(alloc); - CHECK(IsNurseryOwned(alloc) == nurseryOwned); - actualSize = GetAllocSize(alloc); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); + actualSize = GetAllocSize(zone, alloc); CHECK(CheckAllocData(alloc, actualSize)); // Free. @@ -633,7 +636,6 @@ BEGIN_TEST(testBufferAllocator_predicatesOnOtherAllocs) { CHECK(!isMalloced); CHECK(cx->nursery().isInside(buffer)); CHECK(!IsBufferAlloc(buffer)); - CHECK(ChunkPtrIsInsideNursery(buffer)); RootedObject obj(cx, NewPlainObject(cx)); CHECK(obj); diff --git a/js/src/jsapi-tests/testJitABIcalls.cpp b/js/src/jsapi-tests/testJitABIcalls.cpp index aa576b52fa6..e0eb9991b8d 100644 --- a/js/src/jsapi-tests/testJitABIcalls.cpp +++ b/js/src/jsapi-tests/testJitABIcalls.cpp @@ -48,10 +48,10 @@ using namespace js::jit; // Convert the content of each macro list to a single and unique format which is // (Name, Type). -#define ABIFUN_TO_ALLFUN(Fun) (#Fun, decltype(&::Fun)) +#define ABIFUN_TO_ALLFUN(Fun) (#Fun, decltype(&Fun)) #define ABIFUN_AND_SIG_TO_ALLFUN(Fun, Sig) (#Fun " as " #Sig, Sig) #define ABISIG_TO_ALLFUN(Sig) ("(none) as " #Sig, Sig) -#define VMFUN_TO_ALLFUN(Name, Fun, Pop...) (#Fun, decltype(&::Fun)) +#define VMFUN_TO_ALLFUN(Name, Fun, Pop...) (#Fun, decltype(&Fun)) #define APPLY(A, B) A B diff --git a/js/src/make-source-package.py b/js/src/make-source-package.py index 82db8dd50c5..87342529123 100755 --- a/js/src/make-source-package.py +++ b/js/src/make-source-package.py @@ -112,6 +112,7 @@ print("") rsync_filter_list = """ # Top-level config and build files ++ /aclocal.m4 + /client.mk + /configure.py + /LICENSE @@ -382,6 +383,33 @@ def copy_cargo_toml(): f.write(content) +def generate_configure(): + """Generate configure files to avoid build dependency on autoconf-2.13""" + + src_old_configure_in_file = topsrc_dir / "js" / "src" / "old-configure.in" + dest_old_configure_file = target_dir / "js" / "src" / "old-configure" + + js_src_dir = topsrc_dir / "js" / "src" + + env = os.environ.copy() + env["M4"] = m4 + env["AWK"] = awk + env["AC_MACRODIR"] = topsrc_dir / "build" / "autoconf" + + with dest_old_configure_file.open("w") as f: + subprocess.run( + [ + "sh", + str(topsrc_dir / "build" / "autoconf" / "autoconf.sh"), + f"--localdir={js_src_dir}", + str(src_old_configure_in_file), + ], + stdout=f, + check=True, + env=env, + ) + + def copy_file(filename, content): """Copy an existing file from the staging area, or create a new file with the given contents if it does not exist.""" @@ -424,6 +452,7 @@ def stage(): create_target_dir() sync_files() copy_cargo_toml() + generate_configure() copy_file("INSTALL", INSTALL_CONTENT) copy_file("README", README_CONTENT) copy_file("mozconfig", MOZCONFIG_DEBUG_CONTENT) diff --git a/js/src/old-configure.in b/js/src/old-configure.in new file mode 100644 index 00000000000..f507cae34e1 --- /dev/null +++ b/js/src/old-configure.in @@ -0,0 +1,23 @@ +dnl -*- Mode: Autoconf; tab-width: 4; indent-tabs-mode: nil; -*- +dnl vi: set tabstop=4 shiftwidth=4 expandtab syntax=m4: +dnl This Source Code Form is subject to the terms of the Mozilla Public +dnl License, v. 2.0. If a copy of the MPL was not distributed with this +dnl file, You can obtain one at http://mozilla.org/MPL/2.0/. + +dnl Process this file with autoconf to produce a configure script. +dnl ======================================================== +AC_PREREQ(2.13) +AC_INIT(js/src/jsapi.h) +AC_CONFIG_AUX_DIR(${srcdir}/build/autoconf) + +dnl ======================================================== +dnl = +dnl = Maintainer debug option (no --enable equivalent) +dnl = +dnl ======================================================== + +dnl Spit out some output +dnl ======================================================== +MOZ_CREATE_CONFIG_STATUS() + +rm -fr confdefs* $ac_clean_files diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_links.js index 7a5eb5ea15a..3049d7c0cc1 100644 --- a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_links.js +++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_links.js @@ -1,7 +1,7 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a +// tzdata version = 2025b const tzMapper = [ x => x, diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js index 87a6117d3de..266b0d983cf 100644 --- a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js +++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js @@ -1,8 +1,8 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a -const tzdata = "2025a"; +// tzdata version = 2025b +const tzdata = "2025b"; if (typeof getICUOptions === "undefined") { var getICUOptions = SpecialPowers.Cu.getJSTestingFunctions().getICUOptions; diff --git a/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js b/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js index 1c3108f6519..f01a99f48e8 100644 --- a/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js +++ b/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js @@ -1,7 +1,7 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a +// tzdata version = 2025b const zones = [ "Africa/Abidjan", "Africa/Accra", @@ -94,6 +94,7 @@ const zones = [ "America/Chihuahua", "America/Ciudad_Juarez", "America/Costa_Rica", + "America/Coyhaique", "America/Creston", "America/Cuiaba", "America/Curacao", diff --git a/js/src/tests/non262/Temporal/ZonedDateTime/zones-and-links.js b/js/src/tests/non262/Temporal/ZonedDateTime/zones-and-links.js index 4d9fb28ac6a..1c6cc39b534 100644 --- a/js/src/tests/non262/Temporal/ZonedDateTime/zones-and-links.js +++ b/js/src/tests/non262/Temporal/ZonedDateTime/zones-and-links.js @@ -1,7 +1,7 @@ // |reftest| shell-option(--enable-temporal) skip-if(!this.hasOwnProperty("Temporal")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a +// tzdata version = 2025b const zones = [ "Africa/Abidjan", "Africa/Accra", @@ -94,6 +94,7 @@ const zones = [ "America/Chihuahua", "America/Ciudad_Juarez", "America/Costa_Rica", + "America/Coyhaique", "America/Creston", "America/Cuiaba", "America/Curacao", diff --git a/js/src/vm/ArrayBufferObject.cpp b/js/src/vm/ArrayBufferObject.cpp index 7c575cb5044..def0a55d386 100644 --- a/js/src/vm/ArrayBufferObject.cpp +++ b/js/src/vm/ArrayBufferObject.cpp @@ -685,6 +685,28 @@ bool ArrayBufferObject::resizeImpl(JSContext* cx, const CallArgs& args) { return false; } + if (obj->isWasm()) { + // Special case for resizing of Wasm buffers. + if (newByteLength % wasm::PageSize != 0) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_ARRAYBUFFER_PAGE_MULTIPLE); + return false; + } + if (newByteLength < obj->byteLength()) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_ARRAYBUFFER_CANNOT_SHRINK); + return false; + } + + Pages newPages = Pages::fromByteLengthExact(newByteLength); + MOZ_RELEASE_ASSERT(WasmArrayBufferSourceMaxPages(obj).isSome()); + Rooted res( + cx, + obj->wasmGrowToPagesInPlace(obj->wasmAddressType(), newPages, obj, cx)); + MOZ_ASSERT_IF(res, res == obj); + return !!res; + } + // Steps 7-15. obj->resize(size_t(newByteLength)); @@ -1606,8 +1628,6 @@ ArrayBufferObject* ArrayBufferObject::wasmGrowToPagesInPlace( return nullptr; } - CheckStealPreconditions(oldBuf, cx); - MOZ_ASSERT(oldBuf->isWasm()); // Check that the new pages is within our allowable range. This will @@ -1619,6 +1639,25 @@ ArrayBufferObject* ArrayBufferObject::wasmGrowToPagesInPlace( MOZ_ASSERT(newPages <= wasm::MaxMemoryPages(t) && newPages.byteLength() <= ArrayBufferObject::ByteLengthLimit); + if (oldBuf->is()) { + RemoveCellMemory(oldBuf, oldBuf->byteLength(), + MemoryUse::ArrayBufferContents); + + if (!oldBuf->contents().wasmBuffer()->growToPagesInPlace(newPages)) { + // If fails, the buffer still exists on oldBuf, keep tracking + // cell memory there. + AddCellMemory(oldBuf, oldBuf->byteLength(), + MemoryUse::ArrayBufferContents); + return nullptr; + } + oldBuf->setByteLength(newPages.byteLength()); + AddCellMemory(oldBuf, newPages.byteLength(), + MemoryUse::ArrayBufferContents); + return oldBuf; + } + + CheckStealPreconditions(oldBuf, cx); + // We have checked against the clamped maximum and so we know we can convert // to byte lengths now. size_t newSize = newPages.byteLength(); @@ -1662,6 +1701,8 @@ ArrayBufferObject* ArrayBufferObject::wasmGrowToPagesInPlace( ArrayBufferObject* ArrayBufferObject::wasmMovingGrowToPages( AddressType t, Pages newPages, Handle oldBuf, JSContext* cx) { + MOZ_ASSERT(oldBuf->is()); + // On failure, do not throw and ensure that the original buffer is // unmodified and valid. if (oldBuf->isLengthPinned()) { @@ -2339,6 +2380,51 @@ ArrayBufferObject* ArrayBufferObject::createFromNewRawBuffer( return buffer; } +template +ArrayBufferType* ArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle donor) { + // Similar to NewResizableArrayBufferObject/NewArrayBufferObject + constexpr auto allocKind = + GetArrayBufferGCObjectKind(ArrayBufferType::RESERVED_SLOTS); + ArrayBufferType* buffer = + NewArrayBufferObject(cx, nullptr, allocKind); + if (!buffer) { + return nullptr; + } + + RemoveCellMemory(donor, donor->byteLength(), MemoryUse::ArrayBufferContents); + + MOZ_RELEASE_ASSERT(donor->isWasm()); + // The only flag allowed to be set on the `donor` is the resizable flag. + MOZ_RELEASE_ASSERT((donor->flags() & ~KIND_MASK & ~RESIZABLE) == 0); + BufferContents contents(donor->dataPointer(), WASM); + size_t byteLength = donor->byteLength(); + [[maybe_unused]] size_t maxByteLength = donor->wasmClampedMaxByteLength(); + + // Overwrite |oldBuf|'s data pointer *without* releasing old data. + donor->setDataPointer(BufferContents::createNoData()); + ArrayBufferObject::detach(cx, donor); + + if constexpr (std::is_same_v) { + buffer->initialize(byteLength, maxByteLength, contents); + } else { + static_assert( + std::is_same_v); + buffer->initialize(byteLength, contents); + } + + AddCellMemory(buffer, buffer->byteLength(), MemoryUse::ArrayBufferContents); + return buffer; +} + +template FixedLengthArrayBufferObject* +ArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle donor); + +template ResizableArrayBufferObject* +ArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle donor); + /* static */ uint8_t* ArrayBufferObject::stealMallocedContents( JSContext* cx, Handle buffer) { CheckStealPreconditions(buffer, cx); diff --git a/js/src/vm/ArrayBufferObject.h b/js/src/vm/ArrayBufferObject.h index dc1721fb562..c8b40a51f41 100644 --- a/js/src/vm/ArrayBufferObject.h +++ b/js/src/vm/ArrayBufferObject.h @@ -467,6 +467,13 @@ class ArrayBufferObject : public ArrayBufferObjectMaybeShared { WasmArrayRawBuffer* buffer, size_t initialSize); + // Create an ArrayBufferObject object (resizable or fixed-length) based + // on the existing donor object. The |buffer| will be removed from the + // latter, and its ownership will be assumed by the new object. + template + static ArrayBufferType* createFromWasmObject( + JSContext* cx, Handle donor); + static void copyData(ArrayBufferObject* toBuffer, size_t toIndex, ArrayBufferObject* fromBuffer, size_t fromIndex, size_t count); @@ -606,6 +613,11 @@ class ArrayBufferObject : public ArrayBufferObjectMaybeShared { */ inline size_t maxByteLength() const; + size_t wasmClampedMaxByteLength() const { + MOZ_ASSERT(isWasm()); + return wasmClampedMaxPages().byteLength(); + } + size_t associatedBytes() const; uint32_t flags() const; diff --git a/js/src/vm/JSObject.cpp b/js/src/vm/JSObject.cpp index f3713a1ef89..f2728728d0c 100644 --- a/js/src/vm/JSObject.cpp +++ b/js/src/vm/JSObject.cpp @@ -1085,14 +1085,18 @@ bool NativeObject::fixupAfterSwap(JSContext* cx, Handle obj, obj->initSlotUnchecked(i, slotValues[i]); } - MOZ_ASSERT_IF( - obj->hasDynamicSlots() && gc::IsBufferAlloc(obj->getSlotsHeader()), - gc::IsNurseryOwned(obj->getSlotsHeader()) == IsInsideNursery(obj)); - - MOZ_ASSERT_IF(obj->hasDynamicElements() && - gc::IsBufferAlloc(obj->getUnshiftedElementsHeader()), - gc::IsNurseryOwned(obj->getUnshiftedElementsHeader()) == - IsInsideNursery(obj)); +#ifdef DEBUG + Zone* zone = obj->zone(); + if (obj->hasDynamicSlots() && gc::IsBufferAlloc(obj->getSlotsHeader())) { + MOZ_ASSERT(gc::IsNurseryOwned(zone, obj->getSlotsHeader()) == + IsInsideNursery(obj)); + } + if (obj->hasDynamicElements() && + gc::IsBufferAlloc(obj->getUnshiftedElementsHeader())) { + MOZ_ASSERT(gc::IsNurseryOwned(zone, obj->getUnshiftedElementsHeader()) == + IsInsideNursery(obj)); + } +#endif return true; } @@ -3193,13 +3197,13 @@ void JSObject::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, // TODO: These will eventually count as GC heap memory. if (is() && as().hasDynamicSlots()) { info->objectsMallocHeapSlots += - gc::GetAllocSize(as().getSlotsHeader()); + gc::GetAllocSize(zone(), as().getSlotsHeader()); } if (is() && as().hasDynamicElements()) { void* allocatedElements = as().getUnshiftedElementsHeader(); info->objectsMallocHeapElementsNormal += - gc::GetAllocSize(allocatedElements); + gc::GetAllocSize(zone(), allocatedElements); } // Other things may be measured in the future if DMD indicates it is diff --git a/js/src/vm/NativeObject.cpp b/js/src/vm/NativeObject.cpp index 022aacd85dc..33b0beff6b3 100644 --- a/js/src/vm/NativeObject.cpp +++ b/js/src/vm/NativeObject.cpp @@ -854,13 +854,10 @@ bool NativeObject::goodElementsAllocationAmount(JSContext* cx, // We will allocate these in large buffers so account for the header size // required there. static_assert(sizeof(Value) * Mebi >= gc::ChunkSize); - const size_t BufferHeaderCount = gc::LargeBufferHeaderSize / sizeof(Value); - reqAllocated += BufferHeaderCount; // Pick the first bucket that'll fit |reqAllocated|. for (uint32_t b : BigBuckets) { if (b >= reqAllocated) { - b -= BufferHeaderCount; MOZ_ASSERT(b == gc::GetGoodElementCount(b, sizeof(Value))); *goodAmount = b; return true; @@ -868,7 +865,7 @@ bool NativeObject::goodElementsAllocationAmount(JSContext* cx, } // Otherwise, return the maximum bucket size. - *goodAmount = MAX_DENSE_ELEMENTS_ALLOCATION - BufferHeaderCount; + *goodAmount = MAX_DENSE_ELEMENTS_ALLOCATION; return true; } diff --git a/js/src/vm/NativeObject.h b/js/src/vm/NativeObject.h index 6f88347a638..27006dc0a2a 100644 --- a/js/src/vm/NativeObject.h +++ b/js/src/vm/NativeObject.h @@ -1388,8 +1388,7 @@ class NativeObject : public JSObject { // The maximum number of usable dense elements in an object. static const uint32_t MAX_DENSE_ELEMENTS_COUNT = - MAX_DENSE_ELEMENTS_ALLOCATION - ObjectElements::VALUES_PER_HEADER - - gc::LargeBufferHeaderSize / sizeof(Value); + MAX_DENSE_ELEMENTS_ALLOCATION - ObjectElements::VALUES_PER_HEADER; static void elementsSizeMustNotOverflow() { static_assert( diff --git a/js/src/vm/SharedArrayObject.cpp b/js/src/vm/SharedArrayObject.cpp index c53ed78efb6..8b010fb595a 100644 --- a/js/src/vm/SharedArrayObject.cpp +++ b/js/src/vm/SharedArrayObject.cpp @@ -273,8 +273,9 @@ void SharedArrayRawBuffer::dropReference() { } } -bool SharedArrayRawBuffer::grow(size_t newByteLength) { - MOZ_RELEASE_ASSERT(isGrowable()); +bool SharedArrayRawBuffer::growJS(size_t newByteLength) { + MOZ_ASSERT(!isWasm()); + MOZ_RELEASE_ASSERT(isGrowableJS()); // The caller is responsible to ensure |newByteLength| doesn't exceed the // maximum allowed byte length. @@ -386,7 +387,31 @@ bool SharedArrayBufferObject::growImpl(JSContext* cx, const CallArgs& args) { JSMSG_ARRAYBUFFER_LENGTH_LARGER_THAN_MAXIMUM); return false; } - if (!buffer->rawBufferObject()->grow(newByteLength)) { + + if (buffer->isWasm()) { + // Special case for resizing of Wasm buffers. + if (newByteLength % wasm::PageSize != 0) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_ARRAYBUFFER_PAGE_MULTIPLE); + return false; + } + + mozilla::Maybe lock( + mozilla::Some(buffer->rawWasmBufferObject())); + + if (newByteLength < buffer->rawWasmBufferObject()->volatileByteLength()) { + lock.reset(); + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_ARRAYBUFFER_CANNOT_SHRINK); + return false; + } + + Pages newPages = Pages::fromByteLengthExact(newByteLength); + return buffer->rawWasmBufferObject()->wasmGrowToPagesInPlace( + *lock, buffer->wasmAddressType(), newPages); + } + + if (!buffer->rawBufferObject()->growJS(newByteLength)) { JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_SHARED_ARRAY_LENGTH_SMALLER_THAN_CURRENT); return false; @@ -546,11 +571,13 @@ SharedArrayBufferType* SharedArrayBufferObject::NewWith( FixedLengthSharedArrayBufferObject> || std::is_same_v); - if constexpr (std::is_same_v) { - MOZ_ASSERT(!buffer->isGrowable()); - } else { - MOZ_ASSERT(buffer->isGrowable()); + if (!buffer->isWasm()) { + if constexpr (std::is_same_v) { + MOZ_ASSERT(!buffer->isGrowableJS()); + } else { + MOZ_ASSERT(buffer->isGrowableJS()); + } } AutoSetNewObjectMetadata metadata(cx); @@ -684,6 +711,46 @@ SharedArrayBufferObject* SharedArrayBufferObject::createFromNewRawBuffer( return obj; } +template +SharedArrayBufferType* SharedArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle wasmBuffer) { + MOZ_ASSERT(cx->realm()->creationOptions().getSharedMemoryAndAtomicsEnabled()); + MOZ_ASSERT(wasmBuffer->isWasm()); + + SharedArrayRawBuffer* rawBuffer = wasmBuffer->rawBufferObject(); + size_t byteLengthOrMaximum; + if constexpr (std::is_same_v) { + byteLengthOrMaximum = rawBuffer->toWasmBuffer()->wasmClampedMaxByteLength(); + } else { + static_assert(std::is_same_v); + byteLengthOrMaximum = rawBuffer->volatileByteLength(); + } + + if (!rawBuffer->addReference()) { + JS_ReportErrorASCII(cx, "Reference count overflow on SharedArrayBuffer"); + return nullptr; + } + + SharedArrayBufferType* obj = NewWith( + cx, rawBuffer, byteLengthOrMaximum, nullptr); + if (!obj) { + rawBuffer->dropReference(); + return nullptr; + } + + return obj; +} + +template FixedLengthSharedArrayBufferObject* SharedArrayBufferObject:: + createFromWasmObject( + JSContext* cx, Handle wasmBuffer); + +template GrowableSharedArrayBufferObject* +SharedArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle wasmBuffer); + /* static */ void SharedArrayBufferObject::wasmDiscard(Handle buf, uint64_t byteOffset, diff --git a/js/src/vm/SharedArrayObject.h b/js/src/vm/SharedArrayObject.h index 035c6d5edc9..c78f0f1ec26 100644 --- a/js/src/vm/SharedArrayObject.h +++ b/js/src/vm/SharedArrayObject.h @@ -56,8 +56,10 @@ class SharedArrayRawBuffer { // Whether this is a WasmSharedArrayRawBuffer. bool isWasm_; - // Whether this is a growable non-Wasm buffer. - bool isGrowable_; + // Whether this is a growable non-Wasm buffer. All wasm raw buffers are + // growable, but must be grown through a wasm instruction or by getting + // a GSAB object through wasmMemoryObj.toResizableBuffer(). + bool isGrowableJS_; mozilla::Atomic refcount_; mozilla::Atomic length_; @@ -67,15 +69,18 @@ class SharedArrayRawBuffer { FutexWaiter* waiters_ = nullptr; protected: - SharedArrayRawBuffer(bool isGrowable, uint8_t* buffer, size_t length) - : isWasm_(false), isGrowable_(isGrowable), refcount_(1), length_(length) { + SharedArrayRawBuffer(bool isGrowableJS, uint8_t* buffer, size_t length) + : isWasm_(false), + isGrowableJS_(isGrowableJS), + refcount_(1), + length_(length) { MOZ_ASSERT(buffer == dataPointerShared()); } enum class WasmBuffer {}; SharedArrayRawBuffer(WasmBuffer, uint8_t* buffer, size_t length) - : isWasm_(true), isGrowable_(false), refcount_(1), length_(length) { + : isWasm_(true), isGrowableJS_(false), refcount_(1), length_(length) { MOZ_ASSERT(buffer == dataPointerShared()); } @@ -99,7 +104,7 @@ class SharedArrayRawBuffer { bool isWasm() const { return isWasm_; } - bool isGrowable() const { return isGrowable_; } + bool isGrowableJS() const { return isGrowableJS_; } uint32_t refcount() const { return refcount_; } @@ -114,7 +119,7 @@ class SharedArrayRawBuffer { // space. The caller is responsible to ensure that the buffer has been // allocated with enough space to hold at least |newByteLength| bytes. IOW // this method merely sets the number of user accessible bytes of this buffer. - bool grow(size_t newByteLength); + bool growJS(size_t newByteLength); static size_t offsetOfByteLength() { return offsetof(SharedArrayRawBuffer, length_); @@ -192,6 +197,11 @@ class WasmSharedArrayRawBuffer : public SharedArrayRawBuffer { size_t mappedSize() const { return mappedSize_; } + size_t wasmClampedMaxByteLength() const { + MOZ_ASSERT(isWasm()); + return wasmClampedMaxPages().byteLength(); + } + bool wasmGrowToPagesInPlace(const Lock&, wasm::AddressType t, wasm::Pages newPages); @@ -363,9 +373,13 @@ class SharedArrayBufferObject : public ArrayBufferObjectMaybeShared { return byteLengthOrMaxByteLength(); } + wasm::AddressType wasmAddressType() const { + return rawWasmBufferObject()->wasmAddressType(); + } + bool isWasm() const { return rawBufferObject()->isWasm(); } - bool isGrowable() const { return rawBufferObject()->isGrowable(); } + bool isGrowable() const { return is(); } SharedMem dataPointerShared() const { return rawBufferObject()->dataPointerShared(); @@ -383,6 +397,12 @@ class SharedArrayBufferObject : public ArrayBufferObjectMaybeShared { static SharedArrayBufferObject* createFromNewRawBuffer( JSContext* cx, WasmSharedArrayRawBuffer* buffer, size_t initialSize); + // Create an SharedArrayBufferObject object (growable or fixed-length), + // using the same buffer as in the wasmBuffer object. + template + static SharedArrayBufferType* createFromWasmObject( + JSContext* cx, Handle wasmBuffer); + wasm::Pages volatileWasmPages() const { return rawWasmBufferObject()->volatileWasmPages(); } diff --git a/js/src/vm/StructuredClone.cpp b/js/src/vm/StructuredClone.cpp index d3d6fedd40a..b690d0a98e4 100644 --- a/js/src/vm/StructuredClone.cpp +++ b/js/src/vm/StructuredClone.cpp @@ -2915,7 +2915,7 @@ bool JSStructuredCloneReader::readSharedArrayBuffer(StructuredDataType type, bool isGrowable = type == SCTAG_GROWABLE_SHARED_ARRAY_BUFFER_OBJECT; SharedArrayRawBuffer* rawbuf = reinterpret_cast(p); - MOZ_RELEASE_ASSERT(isGrowable == rawbuf->isGrowable()); + MOZ_RELEASE_ASSERT(rawbuf->isWasm() || isGrowable == rawbuf->isGrowableJS()); // There's no guarantee that the receiving agent has enabled shared memory // even if the transmitting agent has done so. Ideally we'd check at the diff --git a/js/src/wasm/WasmJS.cpp b/js/src/wasm/WasmJS.cpp index f2495f6dec9..7a8dce722f7 100644 --- a/js/src/wasm/WasmJS.cpp +++ b/js/src/wasm/WasmJS.cpp @@ -2185,35 +2185,57 @@ static bool IsMemory(HandleValue v) { } /* static */ -bool WasmMemoryObject::bufferGetterImpl(JSContext* cx, const CallArgs& args) { - Rooted memoryObj( - cx, &args.thisv().toObject().as()); - Rooted buffer(cx, &memoryObj->buffer()); - +ArrayBufferObjectMaybeShared* WasmMemoryObject::refreshBuffer( + JSContext* cx, Handle memoryObj, + Handle buffer) { if (memoryObj->isShared()) { size_t memoryLength = memoryObj->volatileMemoryLength(); - MOZ_ASSERT(memoryLength >= buffer->byteLength()); + MOZ_ASSERT_IF(!buffer->is(), + memoryLength >= buffer->byteLength()); - if (memoryLength > buffer->byteLength()) { + // The `length` field on a fixed length SAB cannot change even if + // the underlying memory has grown. The spec therefore requires that + // accessing the buffer property will create a new fixed length SAB + // with the current length if the underlying raw buffer's length has + // changed. We don't need to do this for growable SAB. + if (!buffer->is() && + memoryLength > buffer->byteLength()) { Rooted newBuffer( cx, SharedArrayBufferObject::New( cx, memoryObj->sharedArrayRawBuffer(), memoryLength)); + MOZ_ASSERT(newBuffer->is()); if (!newBuffer) { - return false; + return nullptr; } // OK to addReference after we try to allocate because the memoryObj // keeps the rawBuffer alive. if (!memoryObj->sharedArrayRawBuffer()->addReference()) { JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_SC_SAB_REFCNT_OFLO); - return false; + return nullptr; } - buffer = newBuffer; memoryObj->setReservedSlot(BUFFER_SLOT, ObjectValue(*newBuffer)); + return newBuffer; } } + return buffer; +} - args.rval().setObject(*buffer); +/* static */ +bool WasmMemoryObject::bufferGetterImpl(JSContext* cx, const CallArgs& args) { + Rooted memoryObj( + cx, &args.thisv().toObject().as()); + + Rooted buffer(cx, &memoryObj->buffer()); + MOZ_RELEASE_ASSERT(buffer->isWasm() && !buffer->isPreparedForAsmJS()); + + ArrayBufferObjectMaybeShared* refreshedBuffer = + WasmMemoryObject::refreshBuffer(cx, memoryObj, buffer); + if (!refreshedBuffer) { + return false; + } + + args.rval().setObject(*refreshedBuffer); return true; } @@ -2311,11 +2333,110 @@ bool WasmMemoryObject::discard(JSContext* cx, unsigned argc, Value* vp) { return CallNonGenericMethod(cx, args); } +#ifdef ENABLE_WASM_RESIZABLE_ARRAYBUFFER +/* static */ +bool WasmMemoryObject::toFixedLengthBufferImpl(JSContext* cx, + const CallArgs& args) { + Rooted memory( + cx, &args.thisv().toObject().as()); + + Rooted buffer(cx, &memory->buffer()); + MOZ_RELEASE_ASSERT(buffer->isWasm() && !buffer->isPreparedForAsmJS()); + // If IsFixedLengthArrayBuffer(buffer) is true, return buffer. + if (!buffer->isResizable()) { + ArrayBufferObjectMaybeShared* refreshedBuffer = + refreshBuffer(cx, memory, buffer); + args.rval().set(ObjectValue(*refreshedBuffer)); + return true; + } + + Rooted fixedBuffer(cx); + if (memory->isShared()) { + Rooted oldBuffer( + cx, &buffer->as()); + fixedBuffer.set(SharedArrayBufferObject::createFromWasmObject< + FixedLengthSharedArrayBufferObject>(cx, oldBuffer)); + } else { + Rooted oldBuffer(cx, &buffer->as()); + fixedBuffer.set( + ArrayBufferObject::createFromWasmObject( + cx, oldBuffer)); + } + + if (!fixedBuffer) { + return false; + } + memory->setReservedSlot(BUFFER_SLOT, ObjectValue(*fixedBuffer)); + args.rval().set(ObjectValue(*fixedBuffer)); + return true; +} + +/* static */ +bool WasmMemoryObject::toFixedLengthBuffer(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + return CallNonGenericMethod(cx, args); +} + +/* static */ +bool WasmMemoryObject::toResizableBufferImpl(JSContext* cx, + const CallArgs& args) { + Rooted memory( + cx, &args.thisv().toObject().as()); + + Rooted buffer(cx, &memory->buffer()); + // If IsFixedLengthArrayBuffer(buffer) is false, return buffer. + if (buffer->isResizable()) { + args.rval().set(ObjectValue(*buffer)); + return true; + } + + if (buffer->wasmSourceMaxPages().isNothing()) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_MEMORY_NOT_RESIZABLE); + return false; + } + + Rooted resizableBuffer(cx); + if (memory->isShared()) { + Rooted oldBuffer( + cx, &buffer->as()); + resizableBuffer.set(SharedArrayBufferObject::createFromWasmObject< + GrowableSharedArrayBufferObject>(cx, oldBuffer)); + } else { + Rooted oldBuffer(cx, &buffer->as()); + resizableBuffer.set( + ArrayBufferObject::createFromWasmObject( + cx, oldBuffer)); + } + + if (!resizableBuffer) { + return false; + } + memory->setReservedSlot(BUFFER_SLOT, ObjectValue(*resizableBuffer)); + args.rval().set(ObjectValue(*resizableBuffer)); + return true; +} + +/* static */ +bool WasmMemoryObject::toResizableBuffer(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + return CallNonGenericMethod(cx, args); +} +#endif // ENABLE_WASM_RESIZABLE_ARRAYBUFFER + const JSFunctionSpec WasmMemoryObject::methods[] = { #ifdef ENABLE_WASM_TYPE_REFLECTIONS JS_FN("type", WasmMemoryObject::type, 0, JSPROP_ENUMERATE), #endif JS_FN("grow", WasmMemoryObject::grow, 1, JSPROP_ENUMERATE), +#ifdef ENABLE_WASM_RESIZABLE_ARRAYBUFFER + JS_FN("toFixedLengthBuffer", WasmMemoryObject::toFixedLengthBuffer, 0, + JSPROP_ENUMERATE), + JS_FN("toResizableBuffer", WasmMemoryObject::toResizableBuffer, 0, + JSPROP_ENUMERATE), +#endif JS_FS_END, }; diff --git a/js/src/wasm/WasmJS.h b/js/src/wasm/WasmJS.h index f4f4d04e484..3bcdb92713f 100644 --- a/js/src/wasm/WasmJS.h +++ b/js/src/wasm/WasmJS.h @@ -258,6 +258,10 @@ class WasmMemoryObject : public NativeObject { static bool discardImpl(JSContext* cx, const CallArgs& args); static bool discard(JSContext* cx, unsigned argc, Value* vp); static uint64_t growShared(Handle memory, uint64_t delta); + static bool toFixedLengthBufferImpl(JSContext* cx, const CallArgs& args); + static bool toFixedLengthBuffer(JSContext* cx, unsigned argc, Value* vp); + static bool toResizableBufferImpl(JSContext* cx, const CallArgs& args); + static bool toResizableBuffer(JSContext* cx, unsigned argc, Value* vp); using InstanceSet = JS::WeakCache, @@ -266,6 +270,13 @@ class WasmMemoryObject : public NativeObject { InstanceSet& observers() const; InstanceSet* getOrCreateObservers(JSContext* cx); + // The spec requires that the buffer property will create a new fixed length + // SAB if the underlying raw buffer's length has changed. The method creates + // new objects and updates the BUFFER_SLOT slot. + static ArrayBufferObjectMaybeShared* refreshBuffer( + JSContext* cx, Handle memoryObj, + Handle buffer); + public: static const unsigned RESERVED_SLOTS = 3; static const JSClass class_; diff --git a/js/sub.configure b/js/sub.configure new file mode 100644 index 00000000000..a331a9356bf --- /dev/null +++ b/js/sub.configure @@ -0,0 +1,89 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +@depends(build_environment) +@imports("logging") +@imports(_from="__builtin__", _import="object") +@imports(_from="mozbuild.configure.util", _import="ConfigureOutputHandler") +def old_js_configure(build_env): + class PrefixOutput(object): + def __init__(self, prefix, fh): + self._fh = fh + self._begin_line = True + self._prefix = prefix + + def write(self, content): + if self._begin_line: + self._fh.write(self._prefix) + self._fh.write(("\n" + self._prefix).join(content.splitlines())) + self._begin_line = content.endswith("\n") + if self._begin_line: + self._fh.write("\n") + + def flush(self): + self._fh.flush() + + logger = logging.getLogger("moz.configure") + formatter = logging.Formatter("js/src> %(levelname)s: %(message)s") + for handler in logger.handlers: + handler.setFormatter(formatter) + if isinstance(handler, ConfigureOutputHandler): + handler._stdout = PrefixOutput("js/src> ", handler._stdout) + return os.path.join(build_env.topsrcdir, "js", "src", "old-configure") + + +@depends(old_configure.substs, mozconfig) +def old_js_configure_env(substs, mozconfig): + substs = dict(substs) + # Here, we mimic what we used to do from old-configure, which makes this + # all awkward. + + # Variables that were explicitly exported from old-configure, and those + # explicitly set in the environment when invoking old-configure, were + # automatically inherited from subconfigure. We assume the relevant ones + # have a corresponding AC_SUBST in old-configure, making them available + # in `substs`. + extra_env = {} + + for var in ( + "MOZ_DEV_EDITION", + "STLPORT_LIBS", + ): + if var in substs: + value = substs[var] + elif ( + mozconfig + and var in mozconfig + and not mozconfig[var][1].startswith("removed") + ): + value = mozconfig[var][0] + else: + continue + if isinstance(value, list): + value = " ".join(value) + extra_env[var] = value + + return extra_env + + +old_js_configure = old_configure_for(old_js_configure, extra_env=old_js_configure_env) +set_config("OLD_JS_CONFIGURE_SUBSTS", old_js_configure.substs) +set_config("OLD_JS_CONFIGURE_DEFINES", old_js_configure.defines) + + +@dependable +@imports("logging") +@imports(_from="mozbuild.configure.util", _import="ConfigureOutputHandler") +def post_old_js_configure(): + # Restore unprefixed logging. + formatter = logging.Formatter("%(levelname)s: %(message)s") + logger = logging.getLogger("moz.configure") + for handler in logger.handlers: + handler.setFormatter(formatter) + if isinstance(handler, ConfigureOutputHandler): + handler._stdout.flush() + handler._stdout = handler._stdout._fh diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp index c3116954a13..fa10d805707 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -2249,9 +2249,6 @@ void PresShell::NotifyDestroyingFrame(nsIFrame* aFrame) { } } - EventStateManager* const esm = mPresContext->EventStateManager(); - esm->NotifyDestroyingFrameForGesture(aFrame); - mFramesToDirty.Remove(aFrame); if (ScrollContainerFrame* scrollContainerFrame = do_QueryFrame(aFrame)) { @@ -4452,7 +4449,8 @@ void PresShell::NotifyFontFaceSetOnRefresh() { void PresShell::DoFlushPendingNotifications(FlushType aType) { // by default, flush animations if aType >= FlushType::Style - mozilla::ChangesToFlush flush(aType, aType >= FlushType::Style); + mozilla::ChangesToFlush flush(aType, aType >= FlushType::Style, + aType >= FlushType::Layout); FlushPendingNotifications(flush); } @@ -4502,10 +4500,10 @@ void PresShell::DoFlushPendingNotifications(mozilla::ChangesToFlush aFlush) { */ FlushType flushType = aFlush.mFlushType; - // If this is a layout flush, first update the relevancy of any content - // of elements with `content-visibility: auto` so that the values - // returned from script queries are up-to-date. - if (flushType >= mozilla::FlushType::Layout) { + if (aFlush.mUpdateRelevancy) { + // If needed, first update the relevancy of any content of elements with + // `content-visibility: auto` so that the values returned from e.g. script + // queries are up-to-date. UpdateRelevancyOfContentVisibilityAutoFrames(); } @@ -9868,8 +9866,9 @@ void PresShell::WillPaint() { // reflow being interspersed. Note that we _do_ allow this to be // interruptible; if we can't do all the reflows it's better to flicker a bit // than to freeze up. - FlushPendingNotifications( - ChangesToFlush(FlushType::InterruptibleLayout, false)); + FlushPendingNotifications(ChangesToFlush(FlushType::InterruptibleLayout, + /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ false)); } void PresShell::DidPaintWindow() { @@ -12578,13 +12577,15 @@ PresShell::ProximityToViewportResult PresShell::DetermineProximityToViewport() { DOMIntersectionObserver::IsForProximityToViewport::Yes) .Intersects(); element->SetVisibleForContentVisibility(intersects); - if (oldVisibility.isNothing() || *oldVisibility != intersects) { - frame->UpdateIsRelevantContent(ContentRelevancyReason::Visible); - } // 14.2.3.3 if (checkForInitialDetermination && intersects) { + // Initial determination happens sync, otherwise on the next rendering + // opportunity. + frame->UpdateIsRelevantContent(ContentRelevancyReason::Visible); result.mHadInitialDetermination = true; + } else if (oldVisibility.isNothing() || *oldVisibility != intersects) { + ScheduleContentRelevancyUpdate(ContentRelevancyReason::Visible); } } if (nsPresContext* presContext = GetPresContext()) { diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index 4671a4ad5fd..e7a4042a44a 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -3233,10 +3233,6 @@ void RestyleManager::DoProcessPendingRestyles(ServoTraversalFlags aFlags) { ServoStyleSet* styleSet = StyleSet(); Document* doc = presContext->Document(); - // Ensure the refresh driver is active during traversal to avoid mutating - // mActiveTimer and mMostRecentRefresh time. - presContext->RefreshDriver()->MostRecentRefresh(); - if (!doc->GetServoRestyleRoot()) { // This might post new restyles, so need to do it here. Don't do it if we're // already going to restyle tho, so that we don't potentially reflow with diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index abb53daf833..e27a1442615 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3967,18 +3967,6 @@ nsBlockFrame* nsLayoutUtils::FindNearestBlockAncestor(nsIFrame* aFrame) { return nullptr; } -nsIFrame* nsLayoutUtils::GetNonGeneratedAncestor(nsIFrame* aFrame) { - if (!aFrame->HasAnyStateBits(NS_FRAME_GENERATED_CONTENT)) { - return aFrame; - } - - nsIFrame* f = aFrame; - do { - f = GetParentOrPlaceholderFor(f); - } while (f->HasAnyStateBits(NS_FRAME_GENERATED_CONTENT)); - return f; -} - nsIFrame* nsLayoutUtils::GetParentOrPlaceholderFor(const nsIFrame* aFrame) { // This condition must match the condition in FindContainingBlocks in // RetainedDisplayListBuider.cpp, MarkFrameForDisplayIfVisible and diff --git a/layout/base/nsLayoutUtils.h b/layout/base/nsLayoutUtils.h index 9e439c8a604..99b09843bb8 100644 --- a/layout/base/nsLayoutUtils.h +++ b/layout/base/nsLayoutUtils.h @@ -1392,12 +1392,6 @@ class nsLayoutUtils { */ static nsBlockFrame* FindNearestBlockAncestor(nsIFrame* aFrame); - /** - * Find the nearest ancestor that's not for generated content. Will return - * aFrame if aFrame is not for generated content. - */ - static nsIFrame* GetNonGeneratedAncestor(nsIFrame* aFrame); - /* * Whether the frame is an nsBlockFrame which is not a wrapper block. */ diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index 21a435ca988..4971bb4ecc2 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -2824,8 +2824,7 @@ void nsPresContext::NotifyContentfulPaint() { "We should only notify contentful paint during refresh " "driver ticks"); if (!perf->HadFCPTimingEntry()) { - TimeStamp nowTime = rootPresContext->RefreshDriver()->MostRecentRefresh( - /* aEnsureTimerStarted */ false); + TimeStamp nowTime = rootPresContext->RefreshDriver()->MostRecentRefresh(); MOZ_ASSERT(!nowTime.IsNull(), "Most recent refresh timestamp should exist since we are in " "a refresh driver tick"); diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp index 34f081300c1..3237b9c0d90 100644 --- a/layout/base/nsRefreshDriver.cpp +++ b/layout/base/nsRefreshDriver.cpp @@ -1497,16 +1497,6 @@ void nsRefreshDriver::RestoreNormalRefresh() { mPendingTransactions.Clear(); } -TimeStamp nsRefreshDriver::MostRecentRefresh(bool aEnsureTimerStarted) const { - // In case of stylo traversal, we have already activated the refresh driver in - // RestyleManager::ProcessPendingRestyles(). - if (aEnsureTimerStarted && !ServoStyleSet::IsInServoTraversal()) { - const_cast(this)->EnsureTimerStarted(); - } - - return mMostRecentRefresh; -} - void nsRefreshDriver::AddRefreshObserver(nsARefreshObserver* aObserver, FlushType aFlushType, const char* aObserverDescription) { diff --git a/layout/base/nsRefreshDriver.h b/layout/base/nsRefreshDriver.h index fcc2d45cc42..da908814568 100644 --- a/layout/base/nsRefreshDriver.h +++ b/layout/base/nsRefreshDriver.h @@ -79,7 +79,7 @@ class nsRefreshDriver final : public mozilla::layers::TransactionIdAllocator, * ensure that multiple animations started during the same event off * the main event loop have the same start time.) */ - mozilla::TimeStamp MostRecentRefresh(bool aEnsureTimerStarted = true) const; + mozilla::TimeStamp MostRecentRefresh() const { return mMostRecentRefresh; } /** * Add / remove refresh observers. diff --git a/layout/generic/ReflowInput.h b/layout/generic/ReflowInput.h index a1552aa64fe..47fdd28c7e4 100644 --- a/layout/generic/ReflowInput.h +++ b/layout/generic/ReflowInput.h @@ -533,13 +533,7 @@ struct ReflowInput : public SizeComputationInput { // is from the top of the frame tree. int16_t mReflowDepth = 0; - // Logical and physical accessors for the resize flags. - bool IsHResize() const { - return mWritingMode.IsVertical() ? mFlags.mIsBResize : mFlags.mIsIResize; - } - bool IsVResize() const { - return mWritingMode.IsVertical() ? mFlags.mIsIResize : mFlags.mIsBResize; - } + // Accessors for the resize flags. bool IsIResize() const { return mFlags.mIsIResize; } bool IsBResize() const { return mFlags.mIsBResize; } bool IsBResizeForWM(WritingMode aWM) const { @@ -553,20 +547,6 @@ struct ReflowInput : public SizeComputationInput { return !aWM.IsOrthogonalTo(mWritingMode) ? mFlags.mIsBResizeForPercentages : IsIResize(); } - void SetHResize(bool aValue) { - if (mWritingMode.IsVertical()) { - mFlags.mIsBResize = aValue; - } else { - mFlags.mIsIResize = aValue; - } - } - void SetVResize(bool aValue) { - if (mWritingMode.IsVertical()) { - mFlags.mIsIResize = aValue; - } else { - mFlags.mIsBResize = aValue; - } - } void SetIResize(bool aValue) { mFlags.mIsIResize = aValue; } void SetBResize(bool aValue) { mFlags.mIsBResize = aValue; } void SetBResizeForPercentages(bool aValue) { diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp index 31d7c381a25..09122b069e7 100644 --- a/layout/generic/nsIFrame.cpp +++ b/layout/generic/nsIFrame.cpp @@ -1060,12 +1060,6 @@ void nsIFrame::RemoveDisplayItemDataForDeletion() { delete userDataTable; } - if (!nsLayoutUtils::AreRetainedDisplayListsEnabled()) { - // Retained display lists are disabled, no need to update - // RetainedDisplayListData. - return; - } - auto* builder = nsLayoutUtils::GetRetainedDisplayListBuilder(this); if (!builder) { MOZ_ASSERT(DisplayItems().IsEmpty()); diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index 613443dd081..f07144f2e4d 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -8402,15 +8402,61 @@ std::pair nsTextFrame::GetOffsets() const { return std::make_pair(GetContentOffset(), GetContentEnd()); } -static int32_t FindEndOfPunctuationRun(const nsTextFragment* aFrag, - const gfxTextRun* aTextRun, - gfxSkipCharsIterator* aIter, - int32_t aOffset, int32_t aStart, - int32_t aEnd) { - int32_t i; +static bool IsFirstLetterPrefixPunctuation(uint32_t aChar) { + switch (mozilla::unicode::GetGeneralCategory(aChar)) { + case HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION: /* Pc */ + case HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION: /* Pd */ + case HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION: /* Pe */ + case HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION: /* Pf */ + case HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION: /* Pi */ + case HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION: /* Po */ + case HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION: /* Ps */ + return true; + default: + return false; + } +} +static bool IsFirstLetterSuffixPunctuation(uint32_t aChar) { + switch (mozilla::unicode::GetGeneralCategory(aChar)) { + case HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION: /* Pc */ + case HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION: /* Pe */ + case HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION: /* Pf */ + case HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION: /* Pi */ + case HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION: /* Po */ + return true; + default: + return false; + } +} + +static int32_t FindEndOfPrefixPunctuationRun(const nsTextFragment* aFrag, + const gfxTextRun* aTextRun, + gfxSkipCharsIterator* aIter, + int32_t aOffset, int32_t aStart, + int32_t aEnd) { + int32_t i; for (i = aStart; i < aEnd - aOffset; ++i) { - if (nsContentUtils::IsFirstLetterPunctuation( + if (IsFirstLetterPrefixPunctuation( + aFrag->ScalarValueAt(AssertedCast(aOffset + i)))) { + aIter->SetOriginalOffset(aOffset + i); + FindClusterEnd(aTextRun, aEnd, aIter); + i = aIter->GetOriginalOffset() - aOffset; + } else { + break; + } + } + return i; +} + +static int32_t FindEndOfSuffixPunctuationRun(const nsTextFragment* aFrag, + const gfxTextRun* aTextRun, + gfxSkipCharsIterator* aIter, + int32_t aOffset, int32_t aStart, + int32_t aEnd) { + int32_t i; + for (i = aStart; i < aEnd - aOffset; ++i) { + if (IsFirstLetterSuffixPunctuation( aFrag->ScalarValueAt(AssertedCast(aOffset + i)))) { aIter->SetOriginalOffset(aOffset + i); FindClusterEnd(aTextRun, aEnd, aIter); @@ -8440,7 +8486,6 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, const gfxTextRun* aTextRun, int32_t aOffset, const gfxSkipCharsIterator& aIter, int32_t* aLength) { - int32_t i; int32_t length = *aLength; int32_t endOffset = aOffset + length; gfxSkipCharsIterator iter(aIter); @@ -8464,25 +8509,39 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, return false; }; - // skip leading whitespace, then consume clusters that start with punctuation - i = FindEndOfPunctuationRun( - aFrag, aTextRun, &iter, aOffset, - GetTrimmableWhitespaceCount(aFrag, aOffset, length, 1), endOffset); - if (i == length) { - return false; - } + // Skip any trimmable leading whitespace. + int32_t i = GetTrimmableWhitespaceCount(aFrag, aOffset, length, 1); + while (true) { + // Scan past any leading punctuation. This leaves `j` at the first + // non-punctuation character. + int32_t j = FindEndOfPrefixPunctuationRun(aFrag, aTextRun, &iter, aOffset, + i, endOffset); + if (j == length) { + return false; + } - // skip space/no-break-space after punctuation - while (i < length) { - char16_t ch = aFrag->CharAt(AssertedCast(aOffset + i)); - if (ch == ' ' || ch == CH_NBSP) { - ++i; - } else { + // Scan past any Unicode whitespace characters after punctuation. + while (j < length) { + char16_t ch = aFrag->CharAt(AssertedCast(aOffset + j)); + // The spec says to allow "characters that belong to the `Zs` Unicode + // general category _other than_ U+3000" here. + if (unicode::GetGeneralCategory(ch) == + HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR && + ch != 0x3000) { + ++j; + } else { + break; + } + } + if (j == length) { + return false; + } + if (j == i) { + // If no whitespace was found, we've finished the first-letter prefix; + // if there was some, then go back to check for more punctuation. break; } - } - if (i == length) { - return false; + i = j; } // If the next character is not a letter, number or symbol, there is no @@ -8495,7 +8554,7 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, return true; } - // consume another cluster (the actual first letter) + // Consume another cluster (the actual first letter): // For complex scripts such as Indic and SEAsian, where first-letter // should extend to entire orthographic "syllable" clusters, we don't @@ -8566,9 +8625,12 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, break; } + // NOTE that FindClusterEnd sets the iterator to the last character that is + // part of the cluster, NOT to the first character beyond it. iter.SetOriginalOffset(aOffset + i); FindClusterEnd(aTextRun, endOffset, &iter, allowSplitLigature); + // Index of the last character included in the first-letter cluster. i = iter.GetOriginalOffset() - aOffset; // Heuristic for Indic scripts that like to form conjuncts: @@ -8616,9 +8678,44 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, } } - // consume clusters that start with punctuation - i = FindEndOfPunctuationRun(aFrag, aTextRun, &iter, aOffset, i + 1, - endOffset); + // When we reach here, `i` points to the last character of the first-letter + // cluster, NOT to the first character beyond it. Advance to the next char, + // ready to check for following whitespace/punctuation: + ++i; + + while (i < length) { + // Skip over whitespace, except for word separator characters, before the + // check for following punctuation. But remember the position before the + // whitespace, in case we need to reset. + const int32_t preWS = i; + while (i < length) { + char16_t ch = aFrag->CharAt(AssertedCast(aOffset + i)); + // The spec says the first-letter suffix includes "any intervening + // typographic space -- characters belonging to the Zs Unicode general + // category other than U+3000 IDEOGRAPHIC SPACE or a word separator", + // where "word separator" includes U+0020 and U+00A0. + if (ch == 0x0020 || ch == 0x00A0 || ch == 0x3000 || + unicode::GetGeneralCategory(ch) != + HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR) { + break; + } else { + ++i; + } + } + + // Consume clusters that start with punctuation. + const int32_t prePunct = i; + i = FindEndOfSuffixPunctuationRun(aFrag, aTextRun, &iter, aOffset, i, + endOffset); + + // If we didn't find punctuation here, then we also don't want to include + // any preceding whitespace, so reset our index. + if (i == prePunct) { + i = preWS; + break; + } + } + if (i < length) { *aLength = i; } diff --git a/layout/reftests/box-shadow/reftest.list b/layout/reftests/box-shadow/reftest.list index f8f302b1cc5..a5fee65994b 100644 --- a/layout/reftests/box-shadow/reftest.list +++ b/layout/reftests/box-shadow/reftest.list @@ -33,7 +33,7 @@ fuzzy(0-26,0-3610) fuzzy-if(winWidget,0-26,0-5910) fuzzy-if(!(swgl&&Android),0-6 == boxshadow-inset-large-border-radius.html boxshadow-inset-large-border-radius-ref.html # fuzzy due to blur going inside, but as long as it's essentially black instead of a light gray its ok. -fuzzy(12-15,9400-13267) == boxshadow-inset-large-offset.html boxshadow-inset-large-offset-ref.html +fuzzy(12-15,9400-13267) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),15-15,13726-14412) == boxshadow-inset-large-offset.html boxshadow-inset-large-offset-ref.html == overflow-not-scrollable-1.html overflow-not-scrollable-1-ref.html == overflow-not-scrollable-1.html overflow-not-scrollable-1-ref2.html diff --git a/layout/reftests/first-letter/399941-2-ref.html b/layout/reftests/first-letter/399941-2-ref.html index 6c0639fc1d8..38a5187ff9a 100644 --- a/layout/reftests/first-letter/399941-2-ref.html +++ b/layout/reftests/first-letter/399941-2-ref.html @@ -2,7 +2,8 @@ - Test case for bug 399941, revised in bug 1260366 due to spec changes + Reference: Test case for bug 399941, revised in bug 1260366 and again in + bug 1957384 due to spec changes + +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TEST +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/testing/talos/talos/tests/perf-reftest-singletons/deeply-nested-grid-2.html b/testing/talos/talos/tests/perf-reftest-singletons/deeply-nested-grid-2.html new file mode 100644 index 00000000000..d9727001f43 --- /dev/null +++ b/testing/talos/talos/tests/perf-reftest-singletons/deeply-nested-grid-2.html @@ -0,0 +1,75 @@ + + + + + + + +
1 +
2 +
3 +
4 +
5 +
6 +
7 +
8 +
9 +
10 +
11 +
12 +
13 +
14 +
15 +
16 +
17 +
18 +
19 +
20 +
21 +
22 +
23 +
24 +
25 +
26 +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/testing/talos/talos/tests/perf-reftest-singletons/perf_reftest_singletons.manifest b/testing/talos/talos/tests/perf-reftest-singletons/perf_reftest_singletons.manifest index 57cb45c84b7..e95f588f19f 100644 --- a/testing/talos/talos/tests/perf-reftest-singletons/perf_reftest_singletons.manifest +++ b/testing/talos/talos/tests/perf-reftest-singletons/perf_reftest_singletons.manifest @@ -45,4 +45,6 @@ % http://localhost/tests/perf-reftest-singletons/remove-child-with-lengthy-text.html % http://localhost/tests/perf-reftest-singletons/resize-lengthy-textarea.html % http://localhost/tests/perf-reftest-singletons/thai-reflow.html +% http://localhost/tests/perf-reftest-singletons/deeply-nested-grid-1.html +% http://localhost/tests/perf-reftest-singletons/deeply-nested-grid-2.html # When modifying this list, please also update build/pgo/index.html (If relevant to profile-guided optimzation). diff --git a/testing/web-platform/meta/acid/acid2/reftest.html.ini b/testing/web-platform/meta/acid/acid2/reftest.html.ini index 1cd18173719..e043ed52c1c 100644 --- a/testing/web-platform/meta/acid/acid2/reftest.html.ini +++ b/testing/web-platform/meta/acid/acid2/reftest.html.ini @@ -1,3 +1,4 @@ [reftest.html] expected: + if swgl and (os == "linux") and debug and not fission: [PASS, FAIL] if not swgl: FAIL diff --git a/testing/web-platform/meta/cookie-store/change_eventhandler_for_document_cookie.https.window.js.ini b/testing/web-platform/meta/cookie-store/change_eventhandler_for_document_cookie.https.window.js.ini index 07b26b18012..ad8cdd1e446 100644 --- a/testing/web-platform/meta/cookie-store/change_eventhandler_for_document_cookie.https.window.js.ini +++ b/testing/web-platform/meta/cookie-store/change_eventhandler_for_document_cookie.https.window.js.ini @@ -1,11 +1,11 @@ [change_eventhandler_for_document_cookie.https.window.html] [CookieStore set/overwrite/delete observed by document.cookie] expected: - if os == "mac": PASS + if (os == "mac") and (version == "OS X 14.7.1"): PASS if os == "linux": [FAIL, PASS] [PASS, FAIL] [CookieStore agrees with document.cookie on encoding non-ASCII cookies] expected: if os == "win": [PASS, FAIL] - if os == "linux": [PASS, FAIL] + if os == "linux": [FAIL, PASS] diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-048.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-048.xht.ini new file mode 100644 index 00000000000..6eb513b3892 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-048.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-048.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-346.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-346.xht.ini new file mode 100644 index 00000000000..54432fc620e --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-346.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-346.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-347.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-347.xht.ini new file mode 100644 index 00000000000..22fe051ddae --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-347.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-347.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-348.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-348.xht.ini new file mode 100644 index 00000000000..56411921667 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-348.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-348.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-349.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-349.xht.ini new file mode 100644 index 00000000000..37b78600b30 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-349.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-349.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-350.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-350.xht.ini new file mode 100644 index 00000000000..8ba014f8969 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-350.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-350.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-351.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-351.xht.ini new file mode 100644 index 00000000000..0f87c6b90ef --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-351.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-351.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-352.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-352.xht.ini new file mode 100644 index 00000000000..a555e11f31c --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-352.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-352.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-353.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-353.xht.ini new file mode 100644 index 00000000000..8cca7725526 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-353.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-353.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-354.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-354.xht.ini new file mode 100644 index 00000000000..d49b42ee055 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-354.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-354.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-355.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-355.xht.ini new file mode 100644 index 00000000000..418b58584fb --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-355.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-355.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-356.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-356.xht.ini new file mode 100644 index 00000000000..fd5d925b46e --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-356.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-356.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-357.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-357.xht.ini new file mode 100644 index 00000000000..cbe62658587 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-357.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-357.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-359.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-359.xht.ini new file mode 100644 index 00000000000..1ed3543b821 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-359.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-359.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-360.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-360.xht.ini new file mode 100644 index 00000000000..e90fcfa32a9 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-360.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-360.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-361.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-361.xht.ini new file mode 100644 index 00000000000..c61faf454c2 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-361.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-361.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-362.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-362.xht.ini new file mode 100644 index 00000000000..7f89f6e2bf1 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-362.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-362.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-363.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-363.xht.ini new file mode 100644 index 00000000000..5494a7a903f --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-363.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-363.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-364.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-364.xht.ini new file mode 100644 index 00000000000..ea0e168d065 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-364.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-364.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-365.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-365.xht.ini new file mode 100644 index 00000000000..cb298bfb45d --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-365.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-365.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-366.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-366.xht.ini new file mode 100644 index 00000000000..d6ad429ffd7 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-366.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-366.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-367.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-367.xht.ini new file mode 100644 index 00000000000..9eb44a105cf --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-367.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-367.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-368.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-368.xht.ini new file mode 100644 index 00000000000..49757792f76 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-368.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-368.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-369.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-369.xht.ini new file mode 100644 index 00000000000..74a01387506 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-369.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-369.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-370.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-370.xht.ini new file mode 100644 index 00000000000..811ff15e467 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-370.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-370.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-371.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-371.xht.ini new file mode 100644 index 00000000000..33188dc91dc --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-371.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-371.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-372.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-372.xht.ini new file mode 100644 index 00000000000..018400a3c1b --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-372.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-372.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-373.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-373.xht.ini new file mode 100644 index 00000000000..14f7040e58d --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-373.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-373.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-374.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-374.xht.ini new file mode 100644 index 00000000000..8562b93c9c0 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-374.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-374.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-375.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-375.xht.ini new file mode 100644 index 00000000000..79c2538c381 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-375.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-375.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-376.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-376.xht.ini new file mode 100644 index 00000000000..9e566f93812 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-376.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-376.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-377.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-377.xht.ini new file mode 100644 index 00000000000..c0de5fa78be --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-377.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-377.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-378.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-378.xht.ini new file mode 100644 index 00000000000..3b7eadeb7ee --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-378.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-378.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-379.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-379.xht.ini new file mode 100644 index 00000000000..1c84d488d0f --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-379.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-379.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-380.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-380.xht.ini new file mode 100644 index 00000000000..05d31e74fd0 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-380.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-380.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-381.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-381.xht.ini new file mode 100644 index 00000000000..47c275a7524 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-381.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-381.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-382.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-382.xht.ini new file mode 100644 index 00000000000..b6098840cbb --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-382.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-382.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-383.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-383.xht.ini new file mode 100644 index 00000000000..bc38cc7d8a2 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-383.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-383.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-384.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-384.xht.ini new file mode 100644 index 00000000000..255aa40f563 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-384.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-384.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-385.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-385.xht.ini new file mode 100644 index 00000000000..36f39cb28d9 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-385.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-385.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-386.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-386.xht.ini new file mode 100644 index 00000000000..25f3e9df983 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-386.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-386.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-387.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-387.xht.ini new file mode 100644 index 00000000000..b428dbcf84c --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-387.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-387.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-388.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-388.xht.ini new file mode 100644 index 00000000000..ee4522be9ff --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-388.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-388.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-389.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-389.xht.ini new file mode 100644 index 00000000000..d5033b7702c --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-389.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-389.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-390.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-390.xht.ini new file mode 100644 index 00000000000..8fb41b70dcd --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-390.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-390.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-391.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-391.xht.ini new file mode 100644 index 00000000000..fa190cdd88b --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-391.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-391.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-392.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-392.xht.ini new file mode 100644 index 00000000000..b90d9c01cb2 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-392.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-392.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-393.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-393.xht.ini new file mode 100644 index 00000000000..3b5d91902c3 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-393.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-393.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-395.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-395.xht.ini new file mode 100644 index 00000000000..97f23aa9d13 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-395.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-395.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-396.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-396.xht.ini new file mode 100644 index 00000000000..c4b3f440562 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-396.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-396.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-397.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-397.xht.ini new file mode 100644 index 00000000000..7b6b79a412e --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-397.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-397.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-398.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-398.xht.ini new file mode 100644 index 00000000000..42d17b359c3 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-398.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-398.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-399.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-399.xht.ini new file mode 100644 index 00000000000..d875c32af20 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-399.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-399.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-400.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-400.xht.ini new file mode 100644 index 00000000000..99b8b112eee --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-400.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-400.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-401.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-401.xht.ini new file mode 100644 index 00000000000..b22c51202b3 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-401.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-401.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-402.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-402.xht.ini new file mode 100644 index 00000000000..e39556d39c7 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-402.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-402.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-403.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-403.xht.ini new file mode 100644 index 00000000000..f09b96df47d --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-403.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-403.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-404.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-404.xht.ini new file mode 100644 index 00000000000..fcd75b014d0 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-404.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-404.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-405.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-405.xht.ini new file mode 100644 index 00000000000..375bf51a084 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-405.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-405.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-406.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-406.xht.ini new file mode 100644 index 00000000000..73ce87e3b61 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-406.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-406.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-407.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-407.xht.ini new file mode 100644 index 00000000000..25f8913dfaf --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-407.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-407.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-408.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-408.xht.ini new file mode 100644 index 00000000000..c96d7d90fd1 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-408.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-408.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-409.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-409.xht.ini new file mode 100644 index 00000000000..e55c683a578 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-409.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-409.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-410.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-410.xht.ini new file mode 100644 index 00000000000..d4f7e041a03 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-410.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-410.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-411.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-411.xht.ini new file mode 100644 index 00000000000..414a4fcb10c --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-411.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-411.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-412.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-412.xht.ini new file mode 100644 index 00000000000..cc01b45b73f --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-412.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-412.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/compositing/svg/mix-blend-mode-in-svg-image.html.ini b/testing/web-platform/meta/css/compositing/svg/mix-blend-mode-in-svg-image.html.ini new file mode 100644 index 00000000000..c8a7e63d1db --- /dev/null +++ b/testing/web-platform/meta/css/compositing/svg/mix-blend-mode-in-svg-image.html.ini @@ -0,0 +1,2 @@ +[mix-blend-mode-in-svg-image.html] + max-asserts: 2 diff --git a/testing/web-platform/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini b/testing/web-platform/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini index 72a1c372998..010bca2b414 100644 --- a/testing/web-platform/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini +++ b/testing/web-platform/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini @@ -78,3 +78,9 @@ [corner-shape-render-fuzzy.html?corner-shape=superellipse(0.8)&border-radius=40px&border-width=10px&border-left-color=purple] expected: FAIL + +[corner-shape-render-fuzzy.html?border-radius=50%&corner-top-left-shape=scoop&corner-bottom-right-shape=scoop&corner-top-right-shape=notch&corner-bottom-left-shape=notch&border-width=10px] + expected: FAIL + +[corner-shape-render-fuzzy.html?border-radius=50%&corner-top-right-shape=scoop&corner-bottom-left-shape=scoop&corner-top-left-shape=notch&corner-bottom-right-shape=notch&border-width=10px] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-counter-styles/kannada/css3-counter-styles-128.html.ini b/testing/web-platform/meta/css/css-counter-styles/kannada/css3-counter-styles-128.html.ini new file mode 100644 index 00000000000..114f9c85cd9 --- /dev/null +++ b/testing/web-platform/meta/css/css-counter-styles/kannada/css3-counter-styles-128.html.ini @@ -0,0 +1,2 @@ +[css3-counter-styles-128.html] + max-asserts: 2 diff --git a/testing/web-platform/meta/css/css-scroll-snap/snap-after-relayout/resnap-on-reconstructing-frame.html.ini b/testing/web-platform/meta/css/css-scroll-snap/snap-after-relayout/resnap-on-reconstructing-frame.html.ini index 034fb6f6743..fb0bf5c08cb 100644 --- a/testing/web-platform/meta/css/css-scroll-snap/snap-after-relayout/resnap-on-reconstructing-frame.html.ini +++ b/testing/web-platform/meta/css/css-scroll-snap/snap-after-relayout/resnap-on-reconstructing-frame.html.ini @@ -1,7 +1,10 @@ [resnap-on-reconstructing-frame.html] + expected: + if (os == "linux") and debug and fission: TIMEOUT [Stay at the last snap point even after reconstrucing the scroll container] expected: - if (os == "linux") and not tsan and not fission and not debug: [FAIL, PASS] + if (os == "linux") and not tsan and debug and fission: TIMEOUT + if (os == "linux") and not tsan and not debug and not fission: [PASS, FAIL] if (os == "linux") and tsan: [PASS, FAIL] if (os == "android") and not debug: [PASS, FAIL] if os == "mac": [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-syntax/serialize-consecutive-tokens.html.ini b/testing/web-platform/meta/css/css-syntax/serialize-consecutive-tokens.html.ini index e508baaff84..7e9db6a06ea 100644 --- a/testing/web-platform/meta/css/css-syntax/serialize-consecutive-tokens.html.ini +++ b/testing/web-platform/meta/css/css-syntax/serialize-consecutive-tokens.html.ini @@ -6,3 +6,6 @@ [Comments are handled correctly when computing var(--t1)b using t1:a/* comment */.] expected: FAIL + + [Comments are handled correctly when computing var(--t1)b using t1:'a " '/* comment */.] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/block-with-overflowing-text.html.ini b/testing/web-platform/meta/css/css-view-transitions/block-with-overflowing-text.html.ini deleted file mode 100644 index d7898209733..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/block-with-overflowing-text.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[block-with-overflowing-text.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/capture-with-opacity-zero-child.html.ini b/testing/web-platform/meta/css/css-view-transitions/capture-with-opacity-zero-child.html.ini deleted file mode 100644 index 70b70bd845a..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/capture-with-opacity-zero-child.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[capture-with-opacity-zero-child.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-hidden-child.html.ini b/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-hidden-child.html.ini deleted file mode 100644 index 6dfa7b08e8d..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-hidden-child.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[capture-with-visibility-hidden-child.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-mixed-descendants.html.ini b/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-mixed-descendants.html.ini deleted file mode 100644 index e6de14705be..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-mixed-descendants.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[capture-with-visibility-mixed-descendants.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html.ini b/testing/web-platform/meta/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html.ini deleted file mode 100644 index b91c29d4df4..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[clip-path-larger-than-border-box-on-child-of-named-element.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/content-with-child-with-transparent-background.html.ini b/testing/web-platform/meta/css/css-view-transitions/content-with-child-with-transparent-background.html.ini deleted file mode 100644 index 49be5f6b0eb..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/content-with-child-with-transparent-background.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[content-with-child-with-transparent-background.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/content-with-inline-child.html.ini b/testing/web-platform/meta/css/css-view-transitions/content-with-inline-child.html.ini deleted file mode 100644 index 3c9eeb041dd..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/content-with-inline-child.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[content-with-inline-child.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/element-with-overflow.html.ini b/testing/web-platform/meta/css/css-view-transitions/element-with-overflow.html.ini index ad317c23ecd..2adcb4781c4 100644 --- a/testing/web-platform/meta/css/css-view-transitions/element-with-overflow.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/element-with-overflow.html.ini @@ -1,2 +1,3 @@ [element-with-overflow.html] - expected: FAIL + expected: + if os == "win" and not swgl: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-new.html.ini b/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-new.html.ini deleted file mode 100644 index 84e3fd69235..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-new.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[fractional-box-with-overflow-children-new.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-old.html.ini b/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-old.html.ini deleted file mode 100644 index f598df928ea..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-old.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[fractional-box-with-overflow-children-old.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/inline-child-with-filter.html.ini b/testing/web-platform/meta/css/css-view-transitions/inline-child-with-filter.html.ini deleted file mode 100644 index 5f7c593c0a1..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/inline-child-with-filter.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[inline-child-with-filter.html] - expected: - if (os == "android") and debug and not swgl: [FAIL, TIMEOUT] - FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/inline-child-with-overflow-shadow.html.ini b/testing/web-platform/meta/css/css-view-transitions/inline-child-with-overflow-shadow.html.ini index 6af8d718f5d..11509612f88 100644 --- a/testing/web-platform/meta/css/css-view-transitions/inline-child-with-overflow-shadow.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/inline-child-with-overflow-shadow.html.ini @@ -1,2 +1,5 @@ [inline-child-with-overflow-shadow.html] - expected: FAIL + expected: + if os == "android": PASS + if os == "mac": PASS + FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini b/testing/web-platform/meta/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini index 1f70914513a..33c9009a9b0 100644 --- a/testing/web-platform/meta/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini @@ -1,4 +1,3 @@ [massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html] expected: - if os == "mac": FAIL - if os == "android": FAIL + if os == "android" and not swgl: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini b/testing/web-platform/meta/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini deleted file mode 100644 index 4703270550a..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[massive-element-below-viewport-partially-onscreen-new.html] - expected: - if os == "mac": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini b/testing/web-platform/meta/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini index 87ddbbdba0c..aa9874f1700 100644 --- a/testing/web-platform/meta/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini @@ -1,4 +1,3 @@ [massive-element-right-and-left-of-viewport-partially-onscreen-old.html] expected: - if os == "mac": FAIL if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/new-content-captures-clip-path.html.ini b/testing/web-platform/meta/css/css-view-transitions/new-content-captures-clip-path.html.ini index 1026bf1ddf4..a2485c8e3e2 100644 --- a/testing/web-platform/meta/css/css-view-transitions/new-content-captures-clip-path.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/new-content-captures-clip-path.html.ini @@ -1,3 +1,3 @@ [new-content-captures-clip-path.html] bug: https://bugzil.la/1951167 - expected: [TIMEOUT, ERROR, FAIL] + expected: [TIMEOUT, ERROR, FAIL, PASS] diff --git a/testing/web-platform/meta/css/css-view-transitions/new-content-captures-spans.html.ini b/testing/web-platform/meta/css/css-view-transitions/new-content-captures-spans.html.ini deleted file mode 100644 index 1547d934990..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/new-content-captures-spans.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[new-content-captures-spans.html] - expected: - if os == "mac": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/new-content-preserve-3d-ancestor.html.ini b/testing/web-platform/meta/css/css-view-transitions/new-content-preserve-3d-ancestor.html.ini new file mode 100644 index 00000000000..8e298757857 --- /dev/null +++ b/testing/web-platform/meta/css/css-view-transitions/new-content-preserve-3d-ancestor.html.ini @@ -0,0 +1,2 @@ +[new-content-preserve-3d-ancestor.html] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/new-content-with-overflow.html.ini b/testing/web-platform/meta/css/css-view-transitions/new-content-with-overflow.html.ini deleted file mode 100644 index e5e6fae2602..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/new-content-with-overflow.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[new-content-with-overflow.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/no-root-capture.html.ini b/testing/web-platform/meta/css/css-view-transitions/no-root-capture.html.ini deleted file mode 100644 index 17790fab03f..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/no-root-capture.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[no-root-capture.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/old-content-captures-different-size.html.ini b/testing/web-platform/meta/css/css-view-transitions/old-content-captures-different-size.html.ini deleted file mode 100644 index e1b7da6b4ba..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/old-content-captures-different-size.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[old-content-captures-different-size.html] - expected: - if debug: [FAIL, ERROR] - FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/old-content-is-inline.html.ini b/testing/web-platform/meta/css/css-view-transitions/old-content-is-inline.html.ini index ceaf0606b87..9a2a4280311 100644 --- a/testing/web-platform/meta/css/css-view-transitions/old-content-is-inline.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/old-content-is-inline.html.ini @@ -2,4 +2,3 @@ bug: Fuzz expected: if os == "win": FAIL - if os == "mac": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/old-content-with-overflow.html.ini b/testing/web-platform/meta/css/css-view-transitions/old-content-with-overflow.html.ini deleted file mode 100644 index 7381b140cae..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/old-content-with-overflow.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[old-content-with-overflow.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html.ini b/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html.ini index 59fa618d0ef..3c8d62a8d01 100644 --- a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html.ini @@ -1,2 +1,4 @@ [span-with-overflowing-text-and-box-decorations.html] - expected: FAIL + expected: + if os == "win" and swgl: PASS + FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-hidden.html.ini b/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-hidden.html.ini deleted file mode 100644 index c6b20f59b1d..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-hidden.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[span-with-overflowing-text-hidden.html] - expected: - if os == "mac": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text.html.ini b/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text.html.ini deleted file mode 100644 index 4cb1ee49859..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[span-with-overflowing-text.html] - expected: FAIL diff --git a/testing/web-platform/meta/encoding/textencoder-utf16-surrogates.any.js.ini b/testing/web-platform/meta/encoding/textencoder-utf16-surrogates.any.js.ini index aeca2efe5b2..ebb51b28c5b 100644 --- a/testing/web-platform/meta/encoding/textencoder-utf16-surrogates.any.js.ini +++ b/testing/web-platform/meta/encoding/textencoder-utf16-surrogates.any.js.ini @@ -19,7 +19,9 @@ ERROR [textencoder-utf16-surrogates.https.any.shadowrealm-in-serviceworker.html] - expected: [ERROR, TIMEOUT] + expected: + if (processor == "x86") and (os == "linux"): [ERROR, CRASH, TIMEOUT] + [ERROR, TIMEOUT] [textencoder-utf16-surrogates.https.any.shadowrealm-in-audioworklet.html] expected: ERROR diff --git a/testing/web-platform/meta/fetch/metadata/generated/window-history.https.sub.html.ini b/testing/web-platform/meta/fetch/metadata/generated/window-history.https.sub.html.ini index 6d49c25cc41..327ec2e8f58 100644 --- a/testing/web-platform/meta/fetch/metadata/generated/window-history.https.sub.html.ini +++ b/testing/web-platform/meta/fetch/metadata/generated/window-history.https.sub.html.ini @@ -1,40 +1,49 @@ [window-history.https.sub.html] expected: if (os == "mac") and (version == "OS X 14.7.1"): TIMEOUT - if os == "linux": [OK, TIMEOUT] + if (os == "linux") and tsan: [TIMEOUT, OK] + if (os == "linux") and not tsan: [OK, TIMEOUT] [sec-fetch-user - history.forward] expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if (os == "linux") and debug: [PASS, TIMEOUT] if (os == "linux") and not debug: [PASS, TIMEOUT, NOTRUN] [sec-fetch-user - history.back] expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if (os == "linux") and not debug: [PASS, TIMEOUT, NOTRUN] [sec-fetch-dest - history.forward] expected: if (os == "linux") and not debug and asan: [PASS, TIMEOUT, NOTRUN] if (os == "linux") and not debug and not asan: [PASS, TIMEOUT] + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN [sec-fetch-dest - history.back] expected: + if not asan and (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if asan: [PASS, NOTRUN] [sec-fetch-mode - history.forward] expected: + if not asan and (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if asan: [PASS, NOTRUN] [sec-fetch-mode - history.back] expected: + if not asan and (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if asan: [PASS, NOTRUN] [sec-fetch-site - Same site - history.forward] expected: + if not asan and (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if asan: [PASS, TIMEOUT] [sec-fetch-storage-access - Same site - history.forward] expected: - if (os == "linux") and fission and not debug and not asan: [PASS, TIMEOUT] + if (os == "linux") and fission and not tsan and not debug and not asan: [PASS, TIMEOUT] + if (os == "linux") and fission and tsan: [TIMEOUT, PASS] if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if (os == "linux") and not fission: [PASS, TIMEOUT, NOTRUN] @@ -44,5 +53,17 @@ if (os == "linux") and not fission: [PASS, TIMEOUT] [sec-fetch-storage-access - Cross-site - history.forward] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [sec-fetch-site - Same site - history.back] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [sec-fetch-site - Cross-site - history.forward] expected: if (os == "mac") and (version == "OS X 14.7.1"): TIMEOUT + + [sec-fetch-storage-access - Cross-site - history.back] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN diff --git a/testing/web-platform/meta/html/editing/dnd/platform/pointerdown-add-overflow-hidden.html.ini b/testing/web-platform/meta/html/editing/dnd/platform/pointerdown-add-overflow-hidden.html.ini new file mode 100644 index 00000000000..c50af9629a8 --- /dev/null +++ b/testing/web-platform/meta/html/editing/dnd/platform/pointerdown-add-overflow-hidden.html.ini @@ -0,0 +1,3 @@ +[pointerdown-add-overflow-hidden.html] + expected: + if (os == "android"): TIMEOUT diff --git a/testing/web-platform/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini b/testing/web-platform/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini index 050625e9f76..7474711d45f 100644 --- a/testing/web-platform/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini +++ b/testing/web-platform/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini @@ -1,5 +1,3 @@ [iframe_sandbox_navigate_history_go_forward.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] [Check that sandboxed iframe can not navigate their ancestors] expected: FAIL diff --git a/testing/web-platform/meta/mozilla-sync b/testing/web-platform/meta/mozilla-sync index 0fdcd8e04bc..fdebb5aa2ac 100644 --- a/testing/web-platform/meta/mozilla-sync +++ b/testing/web-platform/meta/mozilla-sync @@ -1 +1 @@ -upstream: 41e905e5f5dacf58b1233b04b5959652d9165fa5 +upstream: 345da84d875becd82120ac159d86acc3b40921f1 diff --git a/testing/web-platform/meta/resource-timing/iframe-sequence-of-events.html.ini b/testing/web-platform/meta/resource-timing/iframe-sequence-of-events.html.ini index 8db9f8444f9..490c81d6bd0 100644 --- a/testing/web-platform/meta/resource-timing/iframe-sequence-of-events.html.ini +++ b/testing/web-platform/meta/resource-timing/iframe-sequence-of-events.html.ini @@ -1,3 +1,30 @@ [iframe-sequence-of-events.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (os == "mac") and (version == "OS X 14.7.1"): TIMEOUT + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->HTTP_NOTSAMESITE_ORIGIN) without TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->HTTP_REMOTE_ORIGIN) with TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_REMOTE_ORIGIN->HTTP_NOTSAMESITE_ORIGIN) without TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): TIMEOUT + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->HTTP_REMOTE_ORIGIN) without TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->ORIGIN) without TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->HTTP_NOTSAMESITE_ORIGIN) with TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->ORIGIN) with TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN diff --git a/testing/web-platform/meta/service-workers/cache-storage/cache-storage-buckets.https.any.js.ini b/testing/web-platform/meta/service-workers/cache-storage/cache-storage-buckets.https.any.js.ini index 4754387d3b9..0b8bcae591f 100644 --- a/testing/web-platform/meta/service-workers/cache-storage/cache-storage-buckets.https.any.js.ini +++ b/testing/web-platform/meta/service-workers/cache-storage/cache-storage-buckets.https.any.js.ini @@ -18,7 +18,7 @@ disabled: if privateBrowsing: https://bugzilla.mozilla.org/show_bug.cgi?id=1320796 expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (os == "win") and not debug and (processor == "x86_64"): [OK, CRASH] [caches from different buckets have different contents] expected: FAIL diff --git a/testing/web-platform/meta/speculation-rules/speculation-tags/prerender-target-hint.https.html.ini b/testing/web-platform/meta/speculation-rules/speculation-tags/prerender-target-hint.https.html.ini new file mode 100644 index 00000000000..b65534f6dbe --- /dev/null +++ b/testing/web-platform/meta/speculation-rules/speculation-tags/prerender-target-hint.https.html.ini @@ -0,0 +1,2 @@ +[prerender-target-hint.https.html] + expected: ERROR diff --git a/testing/web-platform/meta/svg/animations/svglength-animation-LengthModeOther.html.ini b/testing/web-platform/meta/svg/animations/svglength-animation-LengthModeOther.html.ini index 01054d9962c..5b897ab52b7 100644 --- a/testing/web-platform/meta/svg/animations/svglength-animation-LengthModeOther.html.ini +++ b/testing/web-platform/meta/svg/animations/svglength-animation-LengthModeOther.html.ini @@ -1,3 +1,3 @@ [svglength-animation-LengthModeOther.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (processor == "x86") and (os == "linux"): CRASH diff --git a/testing/web-platform/meta/wasm/jsapi/idlharness.any.js.ini b/testing/web-platform/meta/wasm/jsapi/idlharness.any.js.ini index 602a5512bfa..85d566ff631 100644 --- a/testing/web-platform/meta/wasm/jsapi/idlharness.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/idlharness.any.js.ini @@ -3,16 +3,24 @@ expected: FAIL [Memory interface: operation toFixedLengthBuffer()] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: operation toResizableBuffer()] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: [object WebAssembly.Memory\] must inherit property "toFixedLengthBuffer()" with the proper type] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: [object WebAssembly.Memory\] must inherit property "toResizableBuffer()" with the proper type] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [idlharness.any.worker.html] @@ -20,16 +28,24 @@ expected: FAIL [Memory interface: operation toFixedLengthBuffer()] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: operation toResizableBuffer()] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: [object WebAssembly.Memory\] must inherit property "toFixedLengthBuffer()" with the proper type] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: [object WebAssembly.Memory\] must inherit property "toResizableBuffer()" with the proper type] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [idlharness.any.shadowrealm-in-window.html] diff --git a/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer-shared.any.js.ini b/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer-shared.any.js.ini index 43aa21451d4..57838baa82f 100644 --- a/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer-shared.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer-shared.any.js.ini @@ -1,13 +1,18 @@ [to-fixed-length-buffer-shared.any.worker.html] [toFixedLengthBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [to-fixed-length-buffer-shared.any.html] [toFixedLengthBuffer caching behavior] - expected: FAIL - + expected: + if nightly_build: PASS + FAIL [to-fixed-length-buffer-shared.any.js] [toFixedLengthBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL diff --git a/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer.any.js.ini b/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer.any.js.ini index ebf77a21123..a750ddd5017 100644 --- a/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer.any.js.ini @@ -1,6 +1,8 @@ [to-fixed-length-buffer.any.html] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toFixedLengthBuffer caching behavior] expected: FAIL @@ -8,7 +10,9 @@ [to-fixed-length-buffer.any.worker.html] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toFixedLengthBuffer caching behavior] expected: FAIL @@ -16,7 +20,9 @@ [to-fixed-length-buffer.any.js] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toFixedLengthBuffer caching behavior] expected: FAIL diff --git a/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer-shared.any.js.ini b/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer-shared.any.js.ini index cfdf4c7275a..bb11137e4f0 100644 --- a/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer-shared.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer-shared.any.js.ini @@ -1,31 +1,49 @@ [to-resizable-buffer-shared.any.worker.html] [toResizableBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer max size] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [to-resizable-buffer-shared.any.html] [toResizableBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer max size] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [to-resizable-buffer-shared.any.js] [toResizableBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer max size] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL diff --git a/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer.any.js.ini b/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer.any.js.ini index cec054e9262..58305057a9b 100644 --- a/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer.any.js.ini @@ -1,6 +1,8 @@ [to-resizable-buffer.any.worker.html] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer caching behavior] expected: FAIL @@ -9,7 +11,9 @@ expected: FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizable buffers from Memory cannot be detached by JS] expected: FAIL @@ -17,7 +21,9 @@ [to-resizable-buffer.any.html] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer caching behavior] expected: FAIL @@ -26,7 +32,9 @@ expected: FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizable buffers from Memory cannot be detached by JS] expected: FAIL @@ -34,7 +42,9 @@ [to-resizable-buffer.any.js] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer caching behavior] expected: FAIL @@ -43,7 +53,9 @@ expected: FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizable buffers from Memory cannot be detached by JS] expected: FAIL diff --git a/testing/web-platform/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini b/testing/web-platform/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini new file mode 100644 index 00000000000..4b8a53388e2 --- /dev/null +++ b/testing/web-platform/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini @@ -0,0 +1,4 @@ +[user_prompts.py] + [test_dismiss_and_notify[alert-None\]] + expected: + if not sessionHistoryInParent and not debug: [PASS, ERROR] diff --git a/testing/web-platform/meta/webdriver/tests/interop/beforeunload_prompt.py.ini b/testing/web-platform/meta/webdriver/tests/interop/beforeunload_prompt.py.ini index 026cd676ffe..f69c2081cb0 100644 --- a/testing/web-platform/meta/webdriver/tests/interop/beforeunload_prompt.py.ini +++ b/testing/web-platform/meta/webdriver/tests/interop/beforeunload_prompt.py.ini @@ -2,4 +2,6 @@ disabled: if os == "android": bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1879324 expected: - if (os == "mac") and not debug: [OK, TIMEOUT] + if (os == "mac") and not debug and (version == "OS X 14.7.1"): [TIMEOUT, OK] + if (os == "mac") and not debug and (version == "OS X 14.7"): [OK, TIMEOUT] + if (os == "win") and not debug: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/webrtc/simulcast/h264.https.html.ini b/testing/web-platform/meta/webrtc/simulcast/h264.https.html.ini deleted file mode 100644 index ab1c729122f..00000000000 --- a/testing/web-platform/meta/webrtc/simulcast/h264.https.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[h264.https.html] - expected: - if (os == "linux") and debug: TIMEOUT - [H264 simulcast setup with two streams] - expected: - if (os == "linux") and debug: TIMEOUT diff --git a/testing/web-platform/meta/workers/Worker-timeout-decreasing-order.html.ini b/testing/web-platform/meta/workers/Worker-timeout-decreasing-order.html.ini index 0b2d8c032d4..89ab512e7ce 100644 --- a/testing/web-platform/meta/workers/Worker-timeout-decreasing-order.html.ini +++ b/testing/web-platform/meta/workers/Worker-timeout-decreasing-order.html.ini @@ -1,8 +1,7 @@ [Worker-timeout-decreasing-order.html] [Tests timeouts on the worker are fired in decreasing order.] expected: - if (os == "linux") and not tsan and debug and fission: PASS - if (os == "linux") and not tsan and not debug and not fission: PASS - if (os == "android") and not debug and not sessionHistoryInParent: PASS + if (os == "linux") and (processor == "x86_64") and not tsan and debug and fission: PASS + if (os == "linux") and (processor == "x86_64") and not tsan and not debug and not fission: PASS if os == "win": PASS [PASS, FAIL] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/adapter/requestAdapter/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/adapter/requestAdapter/cts.https.html.ini index dc2d9dcf409..406e64ca11e 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/adapter/requestAdapter/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/adapter/requestAdapter/cts.https.html.ini @@ -34,7 +34,6 @@ [cts.https.html?q=webgpu:api,operation,adapter,requestAdapter:requestAdapter_invalid_featureLevel:*] - implementation-status: backlog [:featureLevel=""] [:featureLevel="%20"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/copyTextureToTexture/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/copyTextureToTexture/cts.https.html.ini index 96d48de9e20..369d62d4089 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/copyTextureToTexture/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/copyTextureToTexture/cts.https.html.ini @@ -479,6 +479,7 @@ implementation-status: backlog expected: if os == "win" and debug: [TIMEOUT, CRASH] + if os == "win" and not debug: [OK, CRASH] if os == "linux" and debug: CRASH if os == "mac" and debug: [TIMEOUT, CRASH] [:srcFormat="bgra8unorm";dstFormat="bgra8unorm";dimension="2d"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html.ini index d5f0dd073e9..dfb3dead514 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html.ini @@ -1,947 +1,3 @@ -[cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:*] - implementation-status: backlog - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x5-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x6-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x8-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-12x10-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-12x12-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-4x4-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-5x4-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-5x5-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-6x5-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-6x6-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x5-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x6-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x8-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc1-rgba-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc2-rgba-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc3-rgba-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc4-r-snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc4-r-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc5-rg-snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc5-rg-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc6h-rgb-float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc7-rgba-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="eac-r11unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="eac-rg11snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="eac-rg11unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgb8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgba8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] - expected: FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x8-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-12x10-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-12x12-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-4x4-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-5x4-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-5x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-6x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-6x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x8-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc1-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc2-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc3-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc4-r-snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc4-r-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc5-rg-snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc5-rg-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc6h-rgb-float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc7-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-r11unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-rg11snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-rg11unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgb8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgba8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x10-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x8-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-12x10-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-12x12-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-4x4-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-5x4-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-5x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-6x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-6x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x8-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc1-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc2-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc3-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc5-rg-snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc5-rg-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc6h-rgb-float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc7-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-r11snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-r11unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-rg11snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-rg11unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgb8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgba8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="3d"] - expected: - if os == "win": FAIL - - [cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:offsets_and_sizes:*] tags: [webgpu, webgpu-long] [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] @@ -1924,19 +980,28 @@ [cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:offsets_and_sizes_copy_depth_stencil:*] - implementation-status: backlog + implementation-status: + if os == "win": backlog + if os == "linux": backlog [:format="depth16unorm";copyMethod="CopyT2B";aspect="depth-only"] expected: if os == "win": FAIL if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="CopyB2T";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="CopyT2B";aspect="stencil-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="WriteTexture";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float";copyMethod="CopyT2B";aspect="depth-only"] expected: @@ -1944,14 +1009,24 @@ if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyB2T";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyT2B";aspect="depth-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyT2B";aspect="stencil-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="WriteTexture";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="stencil8";copyMethod="CopyB2T";aspect="stencil-only"] expected: @@ -2718,28 +1793,48 @@ [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="1d"] @@ -2938,20 +2033,32 @@ [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="1d"] @@ -2985,7 +2092,9 @@ [cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:rowsPerImage_and_bytesPerRow:*] - implementation-status: backlog + implementation-status: + if os == "win": backlog + if os == "linux" and debug: backlog expected: if os == "linux" and debug: [OK, TIMEOUT] [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] @@ -3551,12 +2660,16 @@ [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] @@ -3583,210 +2696,280 @@ [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x10-unorm";dimension="2d"] @@ -3877,12 +3060,16 @@ [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-r11snorm";dimension="2d"] @@ -3909,226 +3096,305 @@ [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL [cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:rowsPerImage_and_bytesPerRow_depth_stencil:*] - implementation-status: backlog + implementation-status: + if os == "win": backlog + if os == "linux": backlog [:format="depth16unorm";copyMethod="CopyT2B";aspect="depth-only"] expected: if os == "win": FAIL if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="CopyB2T";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="CopyT2B";aspect="stencil-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="WriteTexture";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float";copyMethod="CopyT2B";aspect="depth-only"] expected: @@ -4136,14 +3402,24 @@ if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyB2T";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyT2B";aspect="depth-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyT2B";aspect="stencil-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="WriteTexture";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="stencil8";copyMethod="CopyB2T";aspect="stencil-only"] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html.ini new file mode 100644 index 00000000000..1059915193b --- /dev/null +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html.ini @@ -0,0 +1,946 @@ +[cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:initMethod="CopyB2T";*] + implementation-status: backlog + [;checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x8-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x10-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x12-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-4x4-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x4-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x8-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc1-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc2-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc3-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc4-r-snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc4-r-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc5-rg-snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc5-rg-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc6h-rgb-float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc7-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-r11unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-rg11snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-rg11unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgba8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: FAIL + + +[cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:initMethod="WriteTexture";*] + implementation-status: + if os == "win": backlog + [;checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x8-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x10-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x12-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-4x4-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x4-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x8-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc1-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc2-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc3-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc4-r-snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc4-r-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc5-rg-snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc5-rg-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc6h-rgb-float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc7-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-r11unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-rg11snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-rg11unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgba8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="astc-10x10-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x5-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x6-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x8-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-12x10-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-12x12-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-4x4-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-5x4-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-5x5-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-6x5-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-6x6-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x5-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x6-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x8-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc1-rgba-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc2-rgba-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc3-rgba-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc4-r-snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc4-r-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc5-rg-snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc5-rg-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc6h-rgb-float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc7-rgba-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="eac-r11snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="eac-r11unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="eac-rg11snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="eac-rg11unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgb8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgba8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r16float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r16sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r16uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r32float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r32sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r32uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r8sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r8snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r8uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg16float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg16sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg16uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg32float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg32sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg32uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg8sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg8snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg8uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba16float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba16sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba16uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba32float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba32sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba32uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/render_pass/clear_value/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/render_pass/clear_value/cts.https.html.ini index cb7fc0fda58..3563427dff5 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/render_pass/clear_value/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/render_pass/clear_value/cts.https.html.ini @@ -11,66 +11,63 @@ [cts.https.html?q=webgpu:api,operation,render_pass,clear_value:stencil_clear_value:*] - implementation-status: backlog + implementation-status: + if os == "mac": backlog [:stencilFormat="depth24plus-stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=1;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=1;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=255;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=255;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=258;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=258;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=65539;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=65539;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=1;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=1;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=255;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=255;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=258;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=258;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=65539;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=65539;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=false] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/rendering/depth_clip_clamp/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/rendering/depth_clip_clamp/cts.https.html.ini index 23f7eb85303..015f3c4e383 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/rendering/depth_clip_clamp/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/rendering/depth_clip_clamp/cts.https.html.ini @@ -1,5 +1,6 @@ [cts.https.html?q=webgpu:api,operation,rendering,depth_clip_clamp:depth_clamp_and_clip:*] - implementation-status: backlog + implementation-status: + if os == "linux": backlog [:format="depth16unorm";unclippedDepth="_undef_";writeDepth=false;multisampled=false] [:format="depth16unorm";unclippedDepth="_undef_";writeDepth=false;multisampled=true] @@ -129,36 +130,34 @@ [:format="depth32float";unclippedDepth=true;writeDepth=true;multisampled=true] [:format="depth32float-stencil8";unclippedDepth="_undef_";writeDepth=false;multisampled=false] - expected: FAIL [:format="depth32float-stencil8";unclippedDepth="_undef_";writeDepth=false;multisampled=true] [:format="depth32float-stencil8";unclippedDepth="_undef_";writeDepth=true;multisampled=false] - expected: FAIL + expected: + if os == "linux": FAIL [:format="depth32float-stencil8";unclippedDepth="_undef_";writeDepth=true;multisampled=true] expected: if os == "linux": FAIL [:format="depth32float-stencil8";unclippedDepth=false;writeDepth=false;multisampled=false] - expected: FAIL [:format="depth32float-stencil8";unclippedDepth=false;writeDepth=false;multisampled=true] [:format="depth32float-stencil8";unclippedDepth=false;writeDepth=true;multisampled=false] - expected: FAIL + expected: + if os == "linux": FAIL [:format="depth32float-stencil8";unclippedDepth=false;writeDepth=true;multisampled=true] expected: if os == "linux": FAIL [:format="depth32float-stencil8";unclippedDepth=true;writeDepth=false;multisampled=false] - expected: FAIL [:format="depth32float-stencil8";unclippedDepth=true;writeDepth=false;multisampled=true] [:format="depth32float-stencil8";unclippedDepth=true;writeDepth=true;multisampled=false] - expected: FAIL [:format="depth32float-stencil8";unclippedDepth=true;writeDepth=true;multisampled=true] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/render/draw/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/render/draw/cts.https.html.ini index 71387ab645d..f05b4c39f61 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/render/draw/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/render/draw/cts.https.html.ini @@ -101,13 +101,11 @@ [:smallIndexBuffer=false;smallVertexBuffer=true;smallInstanceBuffer=false] expected: - if os == "mac" and debug: [PASS, FAIL] - if os == "mac" and not debug: FAIL + if os == "mac": [PASS, FAIL] [:smallIndexBuffer=false;smallVertexBuffer=true;smallInstanceBuffer=true] expected: - if os == "mac" and debug: [PASS, FAIL] - if os == "mac" and not debug: FAIL + if os == "mac": [PASS, FAIL] [:smallIndexBuffer=true;smallVertexBuffer=false;smallInstanceBuffer=false] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat/cts.https.html.ini index ce5b40f5e41..b76c6a017e4 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat/cts.https.html.ini @@ -396,12 +396,20 @@ if os == "mac": [PASS, TIMEOUT, NOTRUN] [:encoderType="render%20pass";call="drawIndexedIndirect";callWithZero=false] + expected: + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:encoderType="render%20pass";call="drawIndexedIndirect";callWithZero=true] + expected: + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:encoderType="render%20pass";call="drawIndirect";callWithZero=false] + expected: + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:encoderType="render%20pass";call="drawIndirect";callWithZero=true] + expected: + if os == "mac": [PASS, TIMEOUT, NOTRUN] [cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:buffer_binding,render_pipeline:*] @@ -880,8 +888,12 @@ if os == "mac": [PASS, TIMEOUT, NOTRUN] [:emptyBindGroupLayoutType="Empty";bindGroupLayoutEntryCount=4;renderCommand="drawIndexedIndirect"] + expected: + if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:emptyBindGroupLayoutType="Empty";bindGroupLayoutEntryCount=4;renderCommand="drawIndirect"] + expected: + if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:emptyBindGroupLayoutType="Null";bindGroupLayoutEntryCount=3;renderCommand="draw"] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/layout_related/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/layout_related/cts.https.html.ini index ed427a8759d..458cfe5a90a 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/layout_related/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/layout_related/cts.https.html.ini @@ -6093,170 +6093,170 @@ if os == "mac": TIMEOUT [:method="CopyB2T";format="astc-10x10-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x10-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x8-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x8-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-12x10-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-12x10-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-12x12-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-12x12-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-4x4-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-4x4-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-5x4-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-5x4-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-5x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-5x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-6x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-6x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-6x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-6x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x8-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x8-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="bc1-rgba-unorm";dimension="2d"] @@ -6429,62 +6429,62 @@ [:method="CopyB2T";format="eac-r11snorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="eac-r11unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="eac-rg11snorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="eac-rg11unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgb8a1unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgb8a1unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgb8unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgb8unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgba8unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgba8unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="r16float";dimension="1d"] @@ -7337,170 +7337,170 @@ [:method="CopyT2B";format="astc-10x10-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x8-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-12x10-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-12x12-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-4x4-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-5x4-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-5x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-6x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-6x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x8-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="bc1-rgba-unorm";dimension="2d"] @@ -7681,62 +7681,62 @@ [:method="CopyT2B";format="eac-r11snorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="eac-r11unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="eac-rg11snorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="eac-rg11unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgb8unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgba8unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="r16float";dimension="1d"] @@ -8589,172 +8589,88 @@ if os == "mac": [TIMEOUT, NOTRUN] [:method="WriteTexture";format="astc-10x10-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x10-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x5-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x5-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x6-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x6-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x8-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x8-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-12x10-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-12x10-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-12x12-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-12x12-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-4x4-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-4x4-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-5x4-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-5x4-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-5x5-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-5x5-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-6x5-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-6x5-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-6x6-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-6x6-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x5-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x5-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x6-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x6-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x8-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x8-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="bc1-rgba-unorm";dimension="2d"] expected: @@ -8925,64 +8841,34 @@ if os == "mac": [FAIL, TIMEOUT, NOTRUN] [:method="WriteTexture";format="eac-r11snorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="eac-r11unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="eac-rg11snorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="eac-rg11unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgb8a1unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgb8a1unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgb8unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgb8unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgba8unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgba8unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="r16float";dimension="1d"] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini index ebb42483b66..68a8c652f05 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini @@ -4296,66 +4296,82 @@ if os == "mac": TIMEOUT [:format="astc-10x10-unorm";usageType="texture";usageCopy="dst";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="dst";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="none";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="none";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="src";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="src";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="src-dest";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="src-dest";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="dst";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="dst";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="none";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="none";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="src";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="src";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="src-dest";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="src-dest";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x5-unorm";usageType="texture";usageCopy="dst";awaitLost=false] @@ -4520,10 +4536,12 @@ [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="dst";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="dst";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="none";awaitLost=false] @@ -4536,6 +4554,7 @@ [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="src";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="src";awaitLost=true] @@ -4544,10 +4563,12 @@ [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="src-dest";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="src-dest";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-12x10-unorm";usageType="texture";usageCopy="dst";awaitLost=false] @@ -4567,6 +4588,7 @@ [:format="astc-12x10-unorm";usageType="texture";usageCopy="none";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-12x10-unorm";usageType="texture";usageCopy="src";awaitLost=false] @@ -7332,11 +7354,13 @@ [:format="rgba16uint";usageType="render";usageCopy="none";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and not debug: [TIMEOUT, NOTRUN] [:format="rgba16uint";usageType="render";usageCopy="none";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and not debug: [TIMEOUT, NOTRUN] @@ -7392,6 +7416,7 @@ [:format="rgba16uint";usageType="storage";usageCopy="src-dest";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and not debug: [TIMEOUT, NOTRUN] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupAdd/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupAdd/cts.https.html.ini index 60187225b57..80273edfad0 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupAdd/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupAdd/cts.https.html.ini @@ -6774,7 +6774,7 @@ [:case=608;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=608;type="f32";wgSize=[128,1,1\]] @@ -6789,22 +6789,22 @@ [:case=609;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=609;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=609;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=609;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=60;type="f16";wgSize=[128,1,1\]] @@ -6817,142 +6817,142 @@ [:case=610;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=610;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=610;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=610;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=611;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=611;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=611;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=611;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=612;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=612;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=612;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=612;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=613;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=613;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=613;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=613;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=614;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=614;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=614;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=614;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=615;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=615;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=615;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=615;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=616;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=616;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=616;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=616;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=617;type="f16";wgSize=[128,1,1\]] @@ -6967,7 +6967,7 @@ [:case=617;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=617;type="f32";wgSize=[64,2,1\]] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupMul/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupMul/cts.https.html.ini index b2ac10b97bc..2eadaaf110b 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupMul/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupMul/cts.https.html.ini @@ -8925,14 +8925,12 @@ [:case=713;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=713;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=713;type="f32";wgSize=[128,1,1\]] @@ -8942,8 +8940,7 @@ [:case=713;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=714;type="f16";wgSize=[128,1,1\]] @@ -8960,8 +8957,7 @@ [:case=714;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=714;type="f32";wgSize=[64,2,1\]] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureGather/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureGather/cts.https.html.ini index c59dcfe31a3..37a7d00a3e0 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureGather/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureGather/cts.https.html.ini @@ -5748,6 +5748,7 @@ [:stage="f";format="rgba8snorm";filt="linear";mode="c"] expected: if os == "linux": [PASS, TIMEOUT, NOTRUN] + if os == "mac" and not debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rgba8snorm";filt="linear";mode="m"] expected: @@ -8502,6 +8503,7 @@ [:stage="v";format="rgba16sint";filt="nearest";mode="r"] expected: if os == "win" and debug: [TIMEOUT, NOTRUN] + if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] if os == "linux": [TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureLoad/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureLoad/cts.https.html.ini index 5eeb879f827..8cd32a0c665 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureLoad/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureLoad/cts.https.html.ini @@ -2788,6 +2788,8 @@ [:stage="v";format="rgba8snorm"] [:stage="v";format="rgba8uint"] + expected: + if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="v";format="rgba8unorm"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleBias/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleBias/cts.https.html.ini index 30e566a2481..f9a8f31c499 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleBias/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleBias/cts.https.html.ini @@ -6,10157 +6,6 @@ if os == "win" and not debug: [OK, CRASH] if os == "linux": CRASH if os == "mac": CRASH - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:arrayed_3d_coords:*] @@ -12183,10157 +2032,6 @@ if os == "win" and not debug: [OK, CRASH] if os == "linux": CRASH if os == "mac": CRASH - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:sampled_3d_coords:*] @@ -22344,23006 +2042,3 @@ if os == "win" and not debug: [OK, CRASH] if os == "linux": CRASH if os == "mac": CRASH - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleCompare/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleCompare/cts.https.html.ini index e3cdbdcc663..ec741099ca4 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleCompare/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleCompare/cts.https.html.ini @@ -987,13 +987,19 @@ [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=true] expected: - if debug: [FAIL, TIMEOUT, NOTRUN] - if not debug: FAIL + if os == "win" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "win" and not debug: FAIL + if os == "linux": [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and not debug: FAIL [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=false] expected: - if debug: [FAIL, TIMEOUT, NOTRUN] - if not debug: FAIL + if os == "win" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "win" and not debug: FAIL + if os == "linux": [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and not debug: FAIL [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=true] expected: @@ -1005,13 +1011,19 @@ [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=false] expected: - if debug: [FAIL, TIMEOUT, NOTRUN] - if not debug: FAIL + if os == "win" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "win" and not debug: FAIL + if os == "linux": [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and not debug: FAIL [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=true] expected: - if debug: [FAIL, TIMEOUT, NOTRUN] - if not debug: FAIL + if os == "win" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "win" and not debug: FAIL + if os == "linux": [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and not debug: FAIL [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=false] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleLevel/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleLevel/cts.https.html.ini index 17268edb0d3..762a79cc3ae 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleLevel/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleLevel/cts.https.html.ini @@ -3367,24 +3367,36 @@ if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8snorm";dim="3d";filt="linear"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8snorm";dim="3d";filt="nearest"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8snorm";dim="cube";filt="linear"] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8snorm";dim="cube";filt="nearest"] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8unorm";dim="3d";filt="linear"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8unorm";dim="3d";filt="nearest"] [:stage="f";format="rg8unorm";dim="cube";filt="linear"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8unorm";dim="cube";filt="nearest"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rgb10a2unorm";dim="3d";filt="linear"] expected: @@ -3491,6 +3503,7 @@ [:stage="f";format="rgba8unorm";dim="3d";filt="nearest"] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rgba8unorm";dim="cube";filt="linear"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/expression/call/builtin/subgroupBitwise/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/expression/call/builtin/subgroupBitwise/cts.https.html.ini index 6711ba4894b..395cfad011b 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/expression/call/builtin/subgroupBitwise/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/expression/call/builtin/subgroupBitwise/cts.https.html.ini @@ -1769,7 +1769,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="u32"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec2%3Cabstract-float%3E"] expected: @@ -1797,7 +1797,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec2%3Cu32%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec3%3Cabstract-float%3E"] expected: @@ -1825,7 +1825,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec3%3Cu32%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec4%3Cabstract-float%3E"] expected: @@ -1853,19 +1853,19 @@ [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec4%3Cu32%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="abstract-float"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="abstract-int"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="bool"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="f16"] expected: @@ -1893,7 +1893,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec2%3Cbool%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec2%3Cf16%3E"] expected: @@ -1921,7 +1921,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec3%3Cbool%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec3%3Cf16%3E"] expected: @@ -1949,7 +1949,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec4%3Cbool%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec4%3Cf16%3E"] expected: diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html index 4c10b641ab1..8948a42959d 100644 --- a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html +++ b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html @@ -33,7 +33,6 @@ - diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html new file mode 100644 index 00000000000..6b6e01d9415 --- /dev/null +++ b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html @@ -0,0 +1,37 @@ + + + + +WebGPU CTS + + + + + + + + + + + diff --git a/testing/web-platform/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html b/testing/web-platform/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html index dd1a32a15ae..590e960830f 100644 --- a/testing/web-platform/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html +++ b/testing/web-platform/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html @@ -23,6 +23,8 @@ + + + + +
  • + Item 1 +
  • + + + diff --git a/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-resource-timing.https.html b/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-resource-timing.https.html index 9d6137d9c52..f554bf7c2ec 100644 --- a/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-resource-timing.https.html +++ b/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-resource-timing.https.html @@ -56,10 +56,12 @@ function test_resource_timing(options) { assert_equals(entry.workerStart, 0, description); assert_equals(entry.workerCacheLookupStart, 0, description); assert_less_than_equal(entry.workerRouterEvaluationStart, entry.fetchStart, description); + assert_greater_than(entry.encodedBodySize, 0, description); break; case 'cache': assert_equals(entry.workerStart, 0, description); assert_greater_than_equal(entry.workerCacheLookupStart, entry.workerRouterEvaluationStart, description); + assert_greater_than(entry.encodedBodySize, 0, description); if (entry.workerFinalSourceType === 'cache') { assert_equals(entry.fetchStart, entry.responseStart, description); assert_less_than_equal(entry.workerCacheLookupStart, entry.responseStart, description); @@ -70,6 +72,7 @@ function test_resource_timing(options) { break; case 'race-network-and-fetch-handler': assert_equals(entry.workerCacheLookupStart, 0, description); + assert_greater_than(entry.encodedBodySize, 0, description); if (entry.workerFinalSourceType === 'network') { assert_equals(entry.workerStart, 0, description); assert_less_than_equal(entry.workerRouterEvaluationStart, entry.fetchStart, description); @@ -79,6 +82,8 @@ function test_resource_timing(options) { } break; case 'fetch-event': + assert_greater_than(entry.encodedBodySize, 0, description); + break; case '': // i.e. no matching rules assert_equals(entry.workerCacheLookupStart, 0, description); assert_greater_than_equal(entry.workerStart, entry.workerRouterEvaluationStart, description); diff --git a/testing/web-platform/tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https.html b/testing/web-platform/tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https.html index 643d4db3869..3d1baaf1907 100644 --- a/testing/web-platform/tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https.html +++ b/testing/web-platform/tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https.html @@ -39,7 +39,7 @@ promise_test(async t => { // Inputs and expectations: // "def" is duplicate. "\x19" is invalid. "undefined" indicates no tag. const rulesetTag = "def"; - const ruleTags = ["jkl", "def", "null", "\x19", "abc", undefined, "ghi"]; + const ruleTags = ["def", "jkl", "def", "null", "\x19", "abc", undefined, "ghi"]; // "def" should be deduped. // "\x19" and "undefined" should be ignored (should not send null tag). const expectedTags = '"abc", "def", "ghi", "jkl", "null"'; @@ -72,4 +72,210 @@ promise_test(async t => { assert_equals(headers.get("sec-speculation-tags"), expectedTags); }, "Sec-Speculation-Tags: deduped and sorted tags"); +// Test the case where multiple tags (including duplicate tags, invalid tags, +// and no tags) specified only on the rule level. These should be deduped and +// sorted before sent as the header. Unlike the previous test, no tag on the +// rule should result in the null tag. +promise_test(async t => { + const params = new URLSearchParams(window.location.search); + const preloadingType = params.get('type'); + + // Inputs and expectations: + // No ruleset level tag. + const rulesetTag = undefined; + // "def" is duplicate. "\x19" is invalid. "undefined" indicates no tag. + const ruleTags = ["def", "jkl", "def", "null", "\x19", "abc", undefined, "ghi"]; + // 5 rules are (no ruleset level tag) + (rule level tag) = + // "abc" only, "def" only, "ghi" only, "jkl" only, "null" only. + // 1 rule is (no ruleset level tag) + (no rule level tag) = null only. + // 2 rule are duplicate or invalid. + // + // All 6 effective rules, including the null rule, get combined to match + // expectedTags. + const expectedTags = 'null, "abc", "def", "ghi", "jkl", "null"'; + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); + + const extraConfig = {}; + const preloadedRC = await referrerRC.helper.createContext({ + executorCreator(url) { + const speculationRule = constructSpeculationRule( + preloadingType, url, rulesetTag, ruleTags); + return referrerRC.executeScript((speculationRule) => { + const script = document.createElement("script"); + script.type = "speculationrules"; + script.textContent = speculationRule; + document.head.append(script); + }, [speculationRule]); + }, extraConfig + }); + + // Navigate to the preloaded page. + await referrerRC.navigateTo(preloadedRC.url); + + const headers = await preloadedRC.getRequestHeaders(); + // Make sure the page is preloaded. + assert_equals( + headers.get("sec-purpose"), + preloadingType === "prefetch" ? "prefetch" : "prefetch;prerender"); + assert_equals(headers.get("sec-speculation-tags"), expectedTags); +}, "Sec-Speculation-Tags: deduped and sorted tags within rules"); + +// Test the case where multiple tags specified on multiple rulesets. These +// should be deduped and sorted before sent as the header. +promise_test(async t => { + const params = new URLSearchParams(window.location.search); + const preloadingType = params.get('type'); + + // Inputs and expectations: + // "def" and "jkl" are duplicate. + const rulesetTag1 = "def"; + const ruleTags1 = ["jkl", "abc"]; + const rulesetTag2 = "jkl"; + const ruleTags2 = ["def", "ghi"]; + // "def" and "jkl" should be deduped. + const expectedTags = '"abc", "def", "ghi", "jkl"'; + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); + + const extraConfig = {}; + const preloadedRC = await referrerRC.helper.createContext({ + executorCreator(url) { + const speculationRules = [ + constructSpeculationRule( + preloadingType, url, rulesetTag1, ruleTags1), + constructSpeculationRule( + preloadingType, url, rulesetTag2, ruleTags2) + ]; + return referrerRC.executeScript((speculationRules) => { + for (const ruleText of speculationRules) { + const script = document.createElement("script"); + script.type = "speculationrules"; + script.textContent = ruleText; + document.head.append(script); + } + }, [speculationRules]); + }, extraConfig + }); + + // Navigate to the preloaded page. + await referrerRC.navigateTo(preloadedRC.url); + + const headers = await preloadedRC.getRequestHeaders(); + // Make sure the page is preloaded. + assert_equals( + headers.get("sec-purpose"), + preloadingType === "prefetch" ? "prefetch" : "prefetch;prerender"); + assert_equals(headers.get("sec-speculation-tags"), expectedTags); +}, "Sec-Speculation-Tags: deduped and sorted tags within multiple rulesets"); + +// Test the case where multiple "null" tags and no tags specified on multiple +// rulesets. These should be deduped and sorted before sent as the header. +promise_test(async t => { + const params = new URLSearchParams(window.location.search); + const preloadingType = params.get('type'); + + // Inputs and expectations: + const rulesetTag1 = undefined; + const ruleTags1 = [undefined, "null", "abc"]; + const rulesetTag2 = undefined; + const ruleTags2 = ["def", undefined, "null"]; + // 4 rules are (no ruleset level tag) + (rule level tag) = + // "abc" only, "def" only, "null" only. + // 2 rules are (no ruleset level tag) + (no rule level tag) = null only. + // + // All rules, including the null rules, get combined to match expectedTags. + const expectedTags = 'null, "abc", "def", "null"'; + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); + + const extraConfig = {}; + const preloadedRC = await referrerRC.helper.createContext({ + executorCreator(url) { + const speculationRules = [ + constructSpeculationRule( + preloadingType, url, rulesetTag1, ruleTags1), + constructSpeculationRule( + preloadingType, url, rulesetTag2, ruleTags2) + ]; + return referrerRC.executeScript((speculationRules) => { + for (const ruleText of speculationRules) { + const script = document.createElement("script"); + script.type = "speculationrules"; + script.textContent = ruleText; + document.head.append(script); + } + }, [speculationRules]); + }, extraConfig + }); + + // Navigate to the preloaded page. + await referrerRC.navigateTo(preloadedRC.url); + + const headers = await preloadedRC.getRequestHeaders(); + // Make sure the page is preloaded. + assert_equals( + headers.get("sec-purpose"), + preloadingType === "prefetch" ? "prefetch" : "prefetch;prerender"); + assert_equals(headers.get("sec-speculation-tags"), expectedTags); +}, "Sec-Speculation-Tags: 'null' tags and no tags within multiple rulesets"); + +// Test the case where 2 rulesets are added but the first ruleset is immediately +// removed before they are processed. Only tags specified on the second ruleset +// should be sent. +promise_test(async t => { + const params = new URLSearchParams(window.location.search); + const preloadingType = params.get('type'); + + // Inputs and expectations: + // Only the first ruleset includes "abc". + const rulesetTag1 = "def"; + const ruleTags1 = ["jkl", "abc"]; + const rulesetTag2 = "jkl"; + const ruleTags2 = ["def", "ghi"]; + // "abc" should not be sent, as the first ruleset is removed. The other + // common tags should be sent regardless of the removal. + const expectedTags = '"def", "ghi", "jkl"'; + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); + + const extraConfig = {}; + const preloadedRC = await referrerRC.helper.createContext({ + executorCreator(url) { + const speculationRules = [ + constructSpeculationRule( + preloadingType, url, rulesetTag1, ruleTags1), + constructSpeculationRule( + preloadingType, url, rulesetTag2, ruleTags2) + ]; + return referrerRC.executeScript((speculationRules) => { + const scripts = []; + for (const ruleText of speculationRules) { + const script = document.createElement("script"); + script.type = "speculationrules"; + script.textContent = ruleText; + document.head.append(script); + scripts.push(script); + } + // Remove the first ruleset. + scripts[0].remove(); + }, [speculationRules]); + }, extraConfig + }); + + // Navigate to the preloaded page. + await referrerRC.navigateTo(preloadedRC.url); + + const headers = await preloadedRC.getRequestHeaders(); + // Make sure the page is preloaded. + assert_equals( + headers.get("sec-purpose"), + preloadingType === "prefetch" ? "prefetch" : "prefetch;prerender"); + assert_equals(headers.get("sec-speculation-tags"), expectedTags); +}, "Sec-Speculation-Tags: removed ruleset"); + diff --git a/testing/web-platform/tests/speculation-rules/speculation-tags/prerender-target-hint.https.html b/testing/web-platform/tests/speculation-rules/speculation-tags/prerender-target-hint.https.html new file mode 100644 index 00000000000..cab8f4586c5 --- /dev/null +++ b/testing/web-platform/tests/speculation-rules/speculation-tags/prerender-target-hint.https.html @@ -0,0 +1,65 @@ + +Sec-Speculation-Tags request headers + + + + + + + + + diff --git a/testing/web-platform/tests/tools/webdriver/webdriver/bidi/modules/emulation.py b/testing/web-platform/tests/tools/webdriver/webdriver/bidi/modules/emulation.py index 5c9624e64c0..e587a082c03 100644 --- a/testing/web-platform/tests/tools/webdriver/webdriver/bidi/modules/emulation.py +++ b/testing/web-platform/tests/tools/webdriver/webdriver/bidi/modules/emulation.py @@ -9,11 +9,11 @@ class CoordinatesOptions(Dict[str, Any]): self, latitude: float, longitude: float, - accuracy: float = None, - altitude: float = None, - altitude_accuracy: float = None, - heading: float = None, - speed: float = None, + accuracy: Optional[float] = None, + altitude: Optional[float] = None, + altitude_accuracy: Optional[float] = None, + heading: Optional[float] = None, + speed: Optional[float] = None, ): self["latitude"] = latitude self["longitude"] = longitude diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py index b3f1fe2af8f..1ef583007d4 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py @@ -161,6 +161,10 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data, subsuite # Disable overlay scrollbar animations to prevent flaky wpt screenshots based on timing. chrome_options["args"].append("--disable-features=ScrollbarAnimations") + # Always enable ViewTransitions long callback timeout to avoid erroneous + # failures due to implicit timeout within the API. + blink_features = ['ViewTransitionLongCallbackTimeoutForTesting'] + if kwargs["enable_mojojs"]: blink_features = ['MojoJS', 'MojoJSTest'] chrome_options["args"].append("--enable-blink-features=" + ','.join(blink_features)) diff --git a/testing/xpcshell/runxpcshelltests.py b/testing/xpcshell/runxpcshelltests.py index 2ac62c6fbd1..ed0885ebf6c 100755 --- a/testing/xpcshell/runxpcshelltests.py +++ b/testing/xpcshell/runxpcshelltests.py @@ -131,7 +131,7 @@ def cleanup_encoding(s): points, etc. If it is a byte string, it is assumed to be UTF-8, but it may not be *correct* UTF-8. Return a sanitized unicode object.""" - if not isinstance(s, (str,)): + if not isinstance(s, str): if isinstance(s, bytes): return six.ensure_str(s) else: @@ -711,7 +711,7 @@ class XPCShellTestThread(Thread): def log_line(self, line): """Log a line of output (either a parser json object or text output from the test process""" - if isinstance(line, (str,)) or isinstance(line, bytes): + if isinstance(line, (str, bytes)): line = self.fix_text_output(line).rstrip("\r\n") self.log.process_output(self.proc_ident, line, command=self.command) else: diff --git a/testing/xpcshell/selftest.py b/testing/xpcshell/selftest.py index 4204201da12..41fe05cd7e9 100755 --- a/testing/xpcshell/selftest.py +++ b/testing/xpcshell/selftest.py @@ -509,7 +509,7 @@ class XPCShellTestsTests(unittest.TestCase): """ testlines = [] for t in tests: - testlines.append('["%s"]' % (t if isinstance(t, (str,)) else t[0])) + testlines.append('["%s"]' % (t if isinstance(t, str) else t[0])) if isinstance(t, tuple): testlines.extend(t[1:]) prefslines = [] diff --git a/third_party/fmt/moz.build b/third_party/fmt/moz.build index b51fbec26dd..348e60c2846 100644 --- a/third_party/fmt/moz.build +++ b/third_party/fmt/moz.build @@ -4,7 +4,8 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -FINAL_LIBRARY = "mozglue" +if CONFIG["MOZ_BUILD_APP"] != "memory": + FINAL_LIBRARY = "mozglue" with Files('**'): BUG_COMPONENT = ('Core', 'mozglue') diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/AUTHORS.md b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/AUTHORS.md similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/AUTHORS.md rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/AUTHORS.md diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/LICENSE b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/LICENSE similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/LICENSE rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/LICENSE diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/METADATA b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/METADATA similarity index 99% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/METADATA rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/METADATA index d85a935efa8..bac1de49109 100644 --- a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/METADATA +++ b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: glean_parser -Version: 17.0.1 +Version: 17.1.0 Summary: Parser tools for Mozilla's Glean telemetry Home-page: https://github.com/mozilla/glean_parser Author: The Glean Team @@ -79,6 +79,10 @@ $ glean_parser check < ping.json ## Unreleased +## 17.1.0 + +- Permit object metrics named 'glean.attribution.ext' or 'glean.distribution.ext' even if allow_reserved is false ([bug 1955428](https://bugzilla.mozilla.org/show_bug.cgi?id=1955428)) + ## 17.0.1 - BUGFIX: Fix missing `ping_arg` "`uploader_capabilities`" in util.py ([#786](https://github.com/mozilla/glean_parser/pull/786)) diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/RECORD b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/RECORD similarity index 83% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/RECORD rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/RECORD index f5c5be12b7d..4b7a9840bc8 100644 --- a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/RECORD +++ b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/RECORD @@ -6,10 +6,10 @@ glean_parser/go_server.py,sha256=NOx66OpNDVIos6n3ejoJeFM5Dk4u7E3u86XV2G54tww,558 glean_parser/javascript.py,sha256=w4ZhNBHBKWYk0h3t7G0Ud2tR__hRqzn9dlEXNKLdQrA,11230 glean_parser/javascript_server.py,sha256=BJpVFuKG3tKFP0_xVyrR9Pn0UrvhumObCEgLeE0Lxhk,9028 glean_parser/kotlin.py,sha256=X2YNmx4boQ6Yb5CPoCIyRFDADrXPKIcIC-AyjkaSLtM,9519 -glean_parser/lint.py,sha256=ktdkR2GjR0wuR4IpLTiZ-q17vI4dk_Nebp4XU3pqzsk,21103 +glean_parser/lint.py,sha256=XqNsb_Km6I1AlAdJuIcaoykoL7bGPXTQoz62icIPHNY,20827 glean_parser/markdown.py,sha256=GkCr1CrV6mnRQseT6FO1-JJ7Eup8X3lxUfRMBTxXpe4,9066 glean_parser/metrics.py,sha256=3_ERPI63CsH_QvXVKNBVKIQTv4KWir2SfSbtn6J8a9Q,15842 -glean_parser/parser.py,sha256=3bJwUGYhnzIHYJ7UBdO63Oi0_n1_Twvr2IOUUe_koME,18132 +glean_parser/parser.py,sha256=IsDMTOLpt_H5GRPXX3G0HQdjeRIPeYFs3TGpVjH1ubA,19383 glean_parser/pings.py,sha256=l4hKmnKigS46vlHFI4aWueKVHcZQL36QfhK0VC8OiFA,3924 glean_parser/python_server.py,sha256=ERpYcbSwF19xKFagxX0mZAvlR1y6D7Ah5DSvW8LipCY,4791 glean_parser/ruby_server.py,sha256=e5lkfcLQAUMUBQDCjqNU82LkdUzT5x-G6HOnsUInbsU,5190 @@ -22,7 +22,7 @@ glean_parser/translation_options.py,sha256=Lxzr6G7MP0tC_ZYlZXftS4j0SLiqO-5mGVTEc glean_parser/util.py,sha256=yTx_-Q8w8rNNSZ_xbno0B90WR7pZZptG2bUWU0sCHZk,16580 glean_parser/validate_ping.py,sha256=0TNvILH6dtzJDys3W8Kqorw6kk03me73OCUDtpoHcXU,2118 glean_parser/schemas/metrics.1-0-0.schema.yaml,sha256=cND3cvi6iBfPUVmtfIBQfGJV9AALpbvN7nu8E33_J-o,19566 -glean_parser/schemas/metrics.2-0-0.schema.yaml,sha256=ieFMxezBuySCvUorx8eGqXRUcoeTql4Z9FxkbkG9XFQ,26715 +glean_parser/schemas/metrics.2-0-0.schema.yaml,sha256=7BrN0qON_j8x9xm4TubGOluViGTG-gIqPyEmYPtKgf4,26716 glean_parser/schemas/pings.1-0-0.schema.yaml,sha256=hwCnsKpEysmrmVp-QHGBArEkVY3vaU1rVsxlTwhAzws,4315 glean_parser/schemas/pings.2-0-0.schema.yaml,sha256=FQBsEt8Eg_ypBUnhJ1THZWXIgtuiYfyXcp_J9pGJUnE,7001 glean_parser/schemas/tags.1-0-0.schema.yaml,sha256=OGXIJlvvVW1vaqB_NVZnwKeZ-sLlfH57vjBSHbj6DNI,1231 @@ -40,10 +40,10 @@ glean_parser/templates/ruby_server.jinja2,sha256=B0pbuld3j_0s7uMjoaCo8_6ehJUZeTX glean_parser/templates/rust.jinja2,sha256=hX8p5HXQNEeVz_sF6SDIyUNus6CcaCG9KWLl6uQLiOU,7285 glean_parser/templates/rust_server.jinja2,sha256=JJdeU5jiWx9aWpF0qiXIYztJ14OQKxV3VFdAbCrtR_0,12841 glean_parser/templates/swift.jinja2,sha256=L_JpwGLVzmOf1FYLoCzFu_RnGTExCIDup7iR1tWzD3o,6912 -glean_parser-17.0.1.dist-info/AUTHORS.md,sha256=yxgj8MioO4wUnrh0gmfb8l3DJJrf-l4HmmEDbQsbbNI,455 -glean_parser-17.0.1.dist-info/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725 -glean_parser-17.0.1.dist-info/METADATA,sha256=fX3p807Z0tgo8pjTGNX4Fxw3gPXT6dJrW_Cw7lnAE_4,36761 -glean_parser-17.0.1.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91 -glean_parser-17.0.1.dist-info/entry_points.txt,sha256=mf9d3sv8BwSjjR58x9KDnpVkONCnv3fPQC2NjJl15Xg,68 -glean_parser-17.0.1.dist-info/top_level.txt,sha256=q7T3duD-9tYZFyDry6Wv2LcdMsK2jGnzdDFhxWcT2Z8,13 -glean_parser-17.0.1.dist-info/RECORD,, +glean_parser-17.1.0.dist-info/AUTHORS.md,sha256=yxgj8MioO4wUnrh0gmfb8l3DJJrf-l4HmmEDbQsbbNI,455 +glean_parser-17.1.0.dist-info/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725 +glean_parser-17.1.0.dist-info/METADATA,sha256=8JtbrOR7bidnVKiBahDVVmNSQj1cLb-wyKicTA2U4hw,36957 +glean_parser-17.1.0.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91 +glean_parser-17.1.0.dist-info/entry_points.txt,sha256=mf9d3sv8BwSjjR58x9KDnpVkONCnv3fPQC2NjJl15Xg,68 +glean_parser-17.1.0.dist-info/top_level.txt,sha256=q7T3duD-9tYZFyDry6Wv2LcdMsK2jGnzdDFhxWcT2Z8,13 +glean_parser-17.1.0.dist-info/RECORD,, diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/WHEEL b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/WHEEL similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/WHEEL rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/WHEEL diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/entry_points.txt b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/entry_points.txt similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/entry_points.txt rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/entry_points.txt diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/top_level.txt b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/top_level.txt similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/top_level.txt rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/top_level.txt diff --git a/third_party/python/glean_parser/glean_parser/lint.py b/third_party/python/glean_parser/glean_parser/lint.py index 4449d660a31..3605618eeec 100644 --- a/third_party/python/glean_parser/glean_parser/lint.py +++ b/third_party/python/glean_parser/glean_parser/lint.py @@ -134,7 +134,6 @@ def check_unit_in_name( time_unit = getattr(metric, "time_unit", None) memory_unit = getattr(metric, "memory_unit", None) - unit = getattr(metric, "unit", None) if time_unit is not None: if ( @@ -175,14 +174,6 @@ def check_unit_in_name( "Confirm the unit is correct and only include memory_unit." ) - elif unit is not None: - if unit_in_name == unit: - yield ( - f"Suffix '{unit_in_name}' is redundant with unit param " - f"'{unit}'. " - "Only include unit." - ) - def check_category_generic( category_name: str, metrics: Iterable[metrics.Metric] diff --git a/third_party/python/glean_parser/glean_parser/parser.py b/third_party/python/glean_parser/glean_parser/parser.py index 3f0536a5e9b..c4f8ab07ea6 100644 --- a/third_party/python/glean_parser/glean_parser/parser.py +++ b/third_party/python/glean_parser/glean_parser/parser.py @@ -188,19 +188,32 @@ def _instantiate_metrics( if category_key == "no_lint": continue if not config.get("allow_reserved") and category_key.split(".")[0] == "glean": - yield util.format_error( - filepath, - f"For category '{category_key}'", - "Categories beginning with 'glean' are reserved for " - "Glean internal use.", - ) - continue + if category_key not in ("glean.attribution", "glean.distribution"): + yield util.format_error( + filepath, + f"For category '{category_key}'", + "Categories beginning with 'glean' are reserved for " + "Glean internal use.", + ) + continue all_objects.setdefault(category_key, DictWrapper()) if not isinstance(category_val, dict): raise TypeError(f"Invalid content for {category_key}") for metric_key, metric_val in sorted(category_val.items()): + if ( + not config.get("allow_reserved") + and category_key in ("glean.attribution", "glean.distribution") + and metric_key != "ext" + ): + yield util.format_error( + filepath, + f"For {category_key}.{metric_key}", + f"May only use semi-reserved category {category_key} with metric name 'ext'", + metric_val.defined_in["line"], + ) + continue try: metric_obj = Metric.make_metric( category_key, metric_key, metric_val, validated=True, config=config @@ -214,18 +227,28 @@ def _instantiate_metrics( ) metric_obj = None else: - if ( - not config.get("allow_reserved") - and "all-pings" in metric_obj.send_in_pings - ): - yield util.format_error( - filepath, - f"On instance {category_key}.{metric_key}", - 'Only internal metrics may specify "all-pings" ' - 'in "send_in_pings"', - metric_val.defined_in["line"], - ) - metric_obj = None + if not config.get("allow_reserved"): + if "all-pings" in metric_obj.send_in_pings: + yield util.format_error( + filepath, + f"On instance {category_key}.{metric_key}", + 'Only internal metrics may specify "all-pings" ' + 'in "send_in_pings"', + metric_val.defined_in["line"], + ) + metric_obj = None + elif ( + metric_obj.identifier() + in ("glean.attribution.ext", "glean.distribution.ext") + and metric_obj.type != "object" + ): + yield util.format_error( + filepath, + f"On instance {category_key}.{metric_key}", + "Extended attribution/distribution metrics must be of type 'object'", + metric_val.defined_in["line"], + ) + metric_obj = None if metric_obj is not None: metric_obj.no_lint = sorted(set(metric_obj.no_lint + global_no_lint)) @@ -481,16 +504,16 @@ def parse_objects( raise TypeError(f"Invalid content for {filepath}") for category_key, category_val in sorted(content.items()): - if category_key.startswith("$"): - continue + if category_key.startswith("$"): + continue - interesting_metrics_dict.setdefault(category_key, DictWrapper()) + interesting_metrics_dict.setdefault(category_key, DictWrapper()) - if not isinstance(category_val, dict): - raise TypeError(f"Invalid category_val for {category_key}") + if not isinstance(category_val, dict): + raise TypeError(f"Invalid category_val for {category_key}") - for metric_key, metric_val in sorted(category_val.items()): - interesting_metrics_dict[category_key][metric_key] = metric_val + for metric_key, metric_val in sorted(category_val.items()): + interesting_metrics_dict[category_key][metric_key] = metric_val for category_key, category_val in all_objects.items(): if category_key == "tags": diff --git a/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml b/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml index 3af3c5d5cfa..66ba46d0a4d 100644 --- a/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml +++ b/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml @@ -565,7 +565,7 @@ definitions: Use is limited to Firefox Desktop only. Has no effect when used with non-FOG outputters. See FOG's documentation on mirroring for details - - https://firefox-source-docs.mozilla.org/toolkit/components/glean/mirroring.html + https://firefox-source-docs.mozilla.org/toolkit/components/glean/user/gifft.html type: string minLength: 6 diff --git a/third_party/python/pyproject.toml b/third_party/python/pyproject.toml index 489a71851a3..575a3ddd829 100644 --- a/third_party/python/pyproject.toml +++ b/third_party/python/pyproject.toml @@ -21,7 +21,7 @@ dependencies = [ "filelock~=3.6", "fluent-migrate==0.13.2", "fluent-syntax==0.19.0", - "glean-parser==17.0.1", + "glean-parser==17.1.0", "importlib-metadata==6.0.0", # Required for compatibility with Flask >= 2 in tools/tryselect/selectors/chooser "jinja2==3.1.2", diff --git a/third_party/python/requirements.txt b/third_party/python/requirements.txt index 0b98e3099cc..cb7883021a4 100644 --- a/third_party/python/requirements.txt +++ b/third_party/python/requirements.txt @@ -358,9 +358,9 @@ gitignorant==0.3.1 \ giturlparse==0.12.0 \ --hash=sha256:c0fff7c21acc435491b1779566e038757a205c1ffdcb47e4f81ea52ad8c3859a \ --hash=sha256:412b74f2855f1da2fefa89fd8dde62df48476077a72fc19b62039554d27360eb -glean-parser==17.0.1 \ - --hash=sha256:764a3b5aaa22d6100100d97a6ce58515687f4e0d06660180024e3101a507f580 \ - --hash=sha256:922b75be353461875802a50dfd052215414dbc2965d153b95ff31d85081c40b7 +glean-parser==17.1.0 \ + --hash=sha256:a59ab66dd734a8bea7d7a2cb632276602dd899411ee1c1cb89f439a833ba1598 \ + --hash=sha256:d353c7eae4f369f6ec198cb61432e7c24d1d06b14aecc05b367f6c498053defc idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 diff --git a/third_party/python/uv.lock b/third_party/python/uv.lock index 506c752a66f..9d719f590b8 100644 --- a/third_party/python/uv.lock +++ b/third_party/python/uv.lock @@ -598,7 +598,7 @@ wheels = [ [[package]] name = "glean-parser" -version = "17.0.1" +version = "17.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -608,9 +608,9 @@ dependencies = [ { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/fd/895160c0fbc1ced0803bd19a2c2473f537efd8e6afa38aae2af12d5535b9/glean_parser-17.0.1.tar.gz", hash = "sha256:764a3b5aaa22d6100100d97a6ce58515687f4e0d06660180024e3101a507f580", size = 290273 } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5e/a2c499e871398869372361a733dc612bb108079c3113ea35f67b6846e58d/glean_parser-17.1.0.tar.gz", hash = "sha256:a59ab66dd734a8bea7d7a2cb632276602dd899411ee1c1cb89f439a833ba1598", size = 291725 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/02/dcc2f155ef74fb2c83d51b7170236f4648adb49f645bac4e5786dc3ac77c/glean_parser-17.0.1-py3-none-any.whl", hash = "sha256:922b75be353461875802a50dfd052215414dbc2965d153b95ff31d85081c40b7", size = 124106 }, + { url = "https://files.pythonhosted.org/packages/8a/bd/be94c7243ff7666ee6c3170fc52791323b0b4d70d9522a9da1911dbbe40d/glean_parser-17.1.0-py3-none-any.whl", hash = "sha256:d353c7eae4f369f6ec198cb61432e7c24d1d06b14aecc05b367f6c498053defc", size = 124309 }, ] [[package]] @@ -925,7 +925,7 @@ requires-dist = [ { name = "filelock", specifier = "~=3.6" }, { name = "fluent-migrate", specifier = "==0.13.2" }, { name = "fluent-syntax", specifier = "==0.19.0" }, - { name = "glean-parser", specifier = "==17.0.1" }, + { name = "glean-parser", specifier = "==17.1.0" }, { name = "importlib-metadata", specifier = "==6.0.0" }, { name = "jinja2", specifier = "==3.1.2" }, { name = "jsmin", specifier = "==3.0.0" }, diff --git a/third_party/python/uv.lock.hash b/third_party/python/uv.lock.hash index 54259ca4172..481932e3d93 100644 --- a/third_party/python/uv.lock.hash +++ b/third_party/python/uv.lock.hash @@ -1 +1 @@ -6811e7a47781ee2d8b491fa59de0ad7a40375d04beeab0f203d5e423f0db5e48 \ No newline at end of file +bef15c648652b3186718606fe950f1a885a86c4abb19b28d8a95f2ad60e2e039 \ No newline at end of file diff --git a/third_party/rust/glean-core/.cargo-checksum.json b/third_party/rust/glean-core/.cargo-checksum.json index 85a4d137a37..146abf79a3d 100644 --- a/third_party/rust/glean-core/.cargo-checksum.json +++ b/third_party/rust/glean-core/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"0359eee0959129d95bc83af3048a2830b7d1f5e87befdf66631da955485a62f8","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"026495898699b54608eb4ec16074ffafc57920d80ccb59961c501a1ea28c9985","build.rs":"4857bea99c6b8c08db8818efa9d3738716f52d3acb68159323957ae52892a3eb","src/common_metric_data.rs":"02dd1628fed6587621c089952dd0cb80bed3c352cdacfb33be7e218ad1d847e9","src/core/mod.rs":"cc723d90c1738bec63b7522793eddfbd4c6d14c792bea49a60cbb361faaa84a1","src/core_metrics.rs":"a877e42e0f8b932adb52a5681ad76fd977808cb48c7eeb29b1e4bbe804f1ea96","src/coverage.rs":"49613fd310bd24d779472720975fbe6c97ec370a95eb55f10afa43f67539c942","src/database/mod.rs":"d9c01ecf92b69a0fe826abf1abf81569ab0dbe61d7f3d8c41201f3a21ac1b13b","src/debug.rs":"7bd9e199d0d5c8170f6dbb9a725a18eaca1df34309d32b02081574962a86816e","src/dispatcher/global.rs":"17493b1a5e926ca1e9c1cda2ee031773402a19183911eb80048630d60266d89e","src/dispatcher/mod.rs":"391310269947452d7e0de24c848c183110c60149d75e345ba6d5d146f222dace","src/error.rs":"b93c7d3e243b21bb9eafc95f17860aba1a942b2f2b0a7f43307690f05fece516","src/error_recording.rs":"32c1f58ff080cb22184bca37e356faadbfe846386880fb0898b773adb3a97d8c","src/event_database/mod.rs":"33519a9f648b6b8a014c23a47c8aa74420511027b9c6984e0c77a4e6192c02c6","src/fd_logger.rs":"0c9def6fa53db1a2ab93c85795f8a7df57797bcfd3978146923e151752e291a6","src/glean.udl":"413784d0c8ef2f0ee34e7535fb10d2f31058dfd558d0121d5ad77d9f00aded96","src/glean_metrics.rs":"9414fb1453d19f6832df33e4c6ef7383d62203e47026bf5bc9552b083101ddd1","src/histogram/exponential.rs":"0f2c0857782d6910754a01438b1b4cd77bf0d3b847fd9ef969ba4da3705c5f5b","src/histogram/functional.rs":"22b2e64c3c1930e055beeebb832e3212e22b65b28e2ebb94c6bb3aff7ca31ba3","src/histogram/linear.rs":"bc33060cbbbb9c777539074cf5f788ab0f1a4ccecce0bf2cae2a697dd5089ea0","src/histogram/mod.rs":"c5eca9f6b0e1e309a7b41c2427d4c1da9c30e832d358d65ba347ba522abfd9c7","src/internal_metrics.rs":"b07018078a09c46ab3416818ddab6bd31a4d5beeeaf677ed6edba10b2b524326","src/internal_pings.rs":"3957a9fe256977a05d8d9e3beeec4c1fd08029db1c516fec4f6b59888e46ef39","src/lib.rs":"b9d89f63cde771d31fea5659ed534478df5f63595254e6a4648ba7c9ad7f8d85","src/lib_unit_tests.rs":"470dca51a00acf316e7afd30d337731724116308553c8596db1890ea8d127388","src/metrics/boolean.rs":"2b9ef57e3582c9bd8b2cca8ab94c962a4871ecc00e837b913c9b0349ba9dff08","src/metrics/counter.rs":"b4a52a8167fb0edd6354f952525e59f3eadb4261de3483374f03c94449d30b92","src/metrics/custom_distribution.rs":"1ec4fd2ecebf547bef0ed28ae6854f641be447bcbf4066a8580f6af16a23e37f","src/metrics/datetime.rs":"e4405762fc71718299fa1b208e3d5fda654bd1b82fe908c884c284e3530de2ec","src/metrics/denominator.rs":"95e8442f90bad97f80fc74b146782f215344b52c5f3825ae0a8baffdc001a714","src/metrics/event.rs":"cd52e200d313e2e6f31707419d4a7fe1cab34916ee145f8136440d6da34aaad4","src/metrics/experiment.rs":"5f9278cca4e133eb8df33bbfe36d1fe0ef3eade8c09f1b46db3c4d0790515412","src/metrics/labeled.rs":"e6afd55c7f7632c962c84de842b302b53df11660ed59b586f85e6e92808a23d8","src/metrics/memory_distribution.rs":"d3f02a6a78ed103024a2479975cd7617153e3f082e20f8f45c8e7afd052cec45","src/metrics/memory_unit.rs":"ee32e020cb303dd631457374048a3ed53a2e7cbacc29c54d17d836fb15507538","src/metrics/mod.rs":"777f89015c1642ed73536b07edc0763d179dbf608e2a0394439fe002cbc2fb53","src/metrics/numerator.rs":"937dfd583b797ac798a525cedca95c5a36262356760a89670d8113983c263154","src/metrics/object.rs":"2a1f1cc31973b576e55ba464b35c41b9420f62471eebba51273bca6856459538","src/metrics/ping.rs":"3b4524e8d17d55fe993746061636fb7d9566b51ac511765e173e7247907f0493","src/metrics/quantity.rs":"1315ae3216ebeec5b5a5baab88d63f88469875f538501e8320716516ef82bddf","src/metrics/rate.rs":"603cc45c149c7a27c93b6a80146bf43f8ce70d9655f905bb5be6bc2c15bcb22b","src/metrics/recorded_experiment.rs":"33958abee79d8b55dec4cb5d20742640423713010f76314075cefde18b5c118a","src/metrics/remote_settings_config.rs":"c85af9f9fef87ddfc578af4f2637c9bdcae18fbc6735ccc87a13a9b0ee0319ab","src/metrics/string.rs":"88beb1a847e5df9898b72ca7ed8ced3b7d2b40d83ff3670baf66f83a3e6cb005","src/metrics/string_list.rs":"ed53a095184c3e8224d0511809b5d7601ba3166505a39b0570f24ebeb0a5b97c","src/metrics/text.rs":"757f6919124d74e0512faa5bb9751a729b6bbc63ebe4d16ca81e9087f5595eaf","src/metrics/time_unit.rs":"4704703e19e799933aec3f39e3d3a125058756d7c7ba04f8729885c7843df447","src/metrics/timespan.rs":"e239c618f459c34f2799c73a4da3e3c6c0b2089ba42d584c2ddd12ed067586e6","src/metrics/timing_distribution.rs":"c61a2cd32a54e018b4b0bb60f030bada40fcbe68d6e6346eac8212cf416e14a3","src/metrics/url.rs":"589ae1f8047367ad8c19b57a48ca8130d5f36cf3ce5954124150f0eb89c620ea","src/metrics/uuid.rs":"cacffd95ab30ed327ec2fa5feaf1359e667706746401f1e2c1195ad9553c4b54","src/ping/mod.rs":"70c6f4966d760e95d450d60bc9e720dec4576febfc487de3634fefacd9f2d8e7","src/scheduler.rs":"eb8131ed075e2d92bf0dc0a2c2a7e67c73bb61042d574c21965b1699cd1239aa","src/storage/mod.rs":"91f02556f113799e0d88d732ab342bda443f43461369e8b41c424c074d742591","src/system.rs":"e3d1b54e1d39cafe6f4dc7ff5021b08c879733f909951b0e1332b3efa9ed97bd","src/traits/boolean.rs":"be0e130f8043215705becc956d45b126c340568f1b24a396c0af9b4334a41ced","src/traits/counter.rs":"c686d26e131d854cd7a7df83c900ca7c17a03c663a30cf58ab48c7259476ce85","src/traits/custom_distribution.rs":"0bd1d425e4c059cca6af2dfb13c78e5e4c6c07fb46c7e31489ad0c5959854833","src/traits/datetime.rs":"636ac1456b1b042e38cf5ae6193c5b232ea0b80df62f583a2097891baef9641b","src/traits/event.rs":"a02235aae630aba7a45a3166b756927252b397af3ecdfab7236931e62725ac49","src/traits/labeled.rs":"c633c68e70a44e73f8aff88aaab1029c0faded3cad08d822590ed8838f24b4fd","src/traits/memory_distribution.rs":"55bb8f45e948319fbba9d28a50d8742da134b066a42e480887db7c7e435f4096","src/traits/mod.rs":"3560fdf3b81dceabbac9d97b0356aa8f883e477dcb787c81a09529047fda7161","src/traits/numerator.rs":"6e4f236bdc448f1bde7a8c249dcd086204c2c69990d3f444e746290929226ed3","src/traits/object.rs":"c03bad670ec7affbc578247f9e1904e898c1870b9bf25750c5094113f995623f","src/traits/ping.rs":"8831c106c03afeb458b0b028fa1ce61f056ebf8e82bc0a171a1bff255d920748","src/traits/quantity.rs":"6ffe25c913bef4315573d747308c182de740b2a4e02ba22cd21d0c33ba521f31","src/traits/rate.rs":"f000790440e0f389f0b160526a9a9a266e58d1405915ae56ac550f482858222c","src/traits/string.rs":"0c3c88382ff2e8eba89c7cfe129c4b84e31140af717819533c14919541ad790c","src/traits/string_list.rs":"14e56b62c2c2be1dd8013f12001f235b084abd2a0d5aa2f7932843877af49ac0","src/traits/text.rs":"8af7d3a0c87cfd8c6d33d6ad47532b431055bbdd395f9110da5630222c23cf93","src/traits/timespan.rs":"52be325a9c061916f34c5b638a07a93b4a14aa89fe365783103d2e06b998f547","src/traits/timing_distribution.rs":"0d35acddd9e35a7f8859cf007162460b5fd0bf06d205cd195ed1c857bbe58c42","src/traits/url.rs":"c27f7add23214ff051078b65b88120b620560d2841a1056c7214d5237e86b9e4","src/traits/uuid.rs":"81322e71c7e847bacaf827a2cd58f6193bdc208355524207f7f38db039da6aa8","src/upload/directory.rs":"363ddc345845c2d543f833a5a63f1c778455e68b36ac77ffce605cef29f0d5cb","src/upload/mod.rs":"edae31e4c2172fb1e8e8b2c5542812b1e29c3bfa2f1c7b08227cb7cc4260dd48","src/upload/policy.rs":"c250957a37783e74af8002cd80ba06ef9780a389fb0f61b8b665b79688f0a360","src/upload/request.rs":"de5532fc3d18e773330c05fe000643d87b9c4912a2d838099b8783538c5033ed","src/upload/result.rs":"c956266c54595d27d5e8b11abffe28fad5fea82995922618805b66cfdcc21d54","src/util.rs":"ee7500434d9758a320dd410f18d7e18da956591e19d2555db87eef9623e4b916","tests/boolean.rs":"76d6014ff108cb6514d9bceb1b2b14749a55b09921f4595a5e30f1bd3546e9f0","tests/collection_enabled.rs":"85f4b2eb49ac23437ae225ae2c44f354c952c24b7c806e2f2ee5dbe78e02c8db","tests/common/mod.rs":"a8f74c906dccfe747d5cf9dd83dd6e4d1ef25d0402d39a2d74105cddab80e54c","tests/counter.rs":"4c59def10e64de0d7a0241dde0267fd02c828b38be8cc67fba90a76004ca6721","tests/custom_distribution.rs":"41c593a0b4561e21f29d1a5b948de964a866253c58ca76ffefebe370fca150e0","tests/datetime.rs":"ec3c9760e70bb2cbc61ab23281c891bc1ec493c5c545466c29fd13e4f05c2c96","tests/event.rs":"5db675dad1bcbcee0451bfe5e93f05f28d7ef8098d19cd302c8bac262567cf0c","tests/labeled.rs":"6f2c6489bcb297b2b64740712b4902e4997fb5c0ba9cb3552a5f6c1fddd45d2f","tests/memory_distribution.rs":"3d9a5b8f99e03f783e3396e4320ee4dc974c895cfef2cec0b14d2a9a9f9b736f","tests/object.rs":"8c35676e04f6ccf54a28764700915e753fc0355bfa5d7804d72caba66fd564cd","tests/ping.rs":"eff68d3b47b04c58d8123214dd66e8d06d11f82ed3fd4f703224f84effb319bb","tests/ping_maker.rs":"20954903888798f63ca83a03ba4703f60ee7ba40dce13f225e8d8e73425d3605","tests/quantity.rs":"55e7dca346fd1d27f0974b78ca3fb12427cb5da2ee637afc08a54f360f947361","tests/rate.rs":"94a3a7d0ccafea02a991ed9dd038cbfab8a534695b374b1ce6ed81285616e9f6","tests/storage.rs":"990dd1d13b9ffa8af0686977a6ac3502c6befb9eaa83649587e2660f51c596c9","tests/string.rs":"397fcfd27c25f0e81e2a40db3265b0d7dc0dd56b190319c1f86cb1c2c0ed4f9d","tests/string_list.rs":"34efa2afe3e89e6635f21ec9c80650d5816e35e9cb85163d894d600a5b3a4e3a","tests/text.rs":"1d43f6b90a43124311cacf0a6ee16f9e1e9263bcd11fee8b996d6efd81633638","tests/timespan.rs":"3d05739a93f3e0ea7264e8fdea876bd948714e5b44e82b8fd7c0218fdb597bb3","tests/timing_distribution.rs":"072ad950b2162e503150e411119b9a000573538bd2cff93c1c1a3616d1589ef4","tests/uuid.rs":"e0e58614319f5e973126f5b4e68d9289ccd6d65e428aca215bf7dcc8a0504889","uniffi.toml":"6ddc98b686b0925a81abd9d1c769e5c98ac29771b210a1c535931a46dec9a8e3"},"package":"a49d1d62648ddeed8cb996373046ea45de93f1d1ff956aba054b9304bc305753"} \ No newline at end of file +{"files":{"Cargo.toml":"ffc8000a6fb68eb9465dff661e40e43b95fef93cf874a03bc8c4bc9642c6e766","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"026495898699b54608eb4ec16074ffafc57920d80ccb59961c501a1ea28c9985","build.rs":"4857bea99c6b8c08db8818efa9d3738716f52d3acb68159323957ae52892a3eb","src/common_metric_data.rs":"02dd1628fed6587621c089952dd0cb80bed3c352cdacfb33be7e218ad1d847e9","src/core/mod.rs":"e749d51f05fcfc9651e4021cd90682dafc107e58db0083e1b48f8df277d4581c","src/core_metrics.rs":"fb9707a4df04113d84e7608a15a7a4fd6a826a97b9aad73ec3438a8cad92b4b0","src/coverage.rs":"49613fd310bd24d779472720975fbe6c97ec370a95eb55f10afa43f67539c942","src/database/mod.rs":"d9c01ecf92b69a0fe826abf1abf81569ab0dbe61d7f3d8c41201f3a21ac1b13b","src/debug.rs":"7bd9e199d0d5c8170f6dbb9a725a18eaca1df34309d32b02081574962a86816e","src/dispatcher/global.rs":"17493b1a5e926ca1e9c1cda2ee031773402a19183911eb80048630d60266d89e","src/dispatcher/mod.rs":"391310269947452d7e0de24c848c183110c60149d75e345ba6d5d146f222dace","src/error.rs":"b93c7d3e243b21bb9eafc95f17860aba1a942b2f2b0a7f43307690f05fece516","src/error_recording.rs":"32c1f58ff080cb22184bca37e356faadbfe846386880fb0898b773adb3a97d8c","src/event_database/mod.rs":"33519a9f648b6b8a014c23a47c8aa74420511027b9c6984e0c77a4e6192c02c6","src/fd_logger.rs":"0c9def6fa53db1a2ab93c85795f8a7df57797bcfd3978146923e151752e291a6","src/glean.udl":"74a2334177724f571eb6986015aa5514766472fccf1686e888baaa909881d6f2","src/glean_metrics.rs":"9414fb1453d19f6832df33e4c6ef7383d62203e47026bf5bc9552b083101ddd1","src/histogram/exponential.rs":"0f2c0857782d6910754a01438b1b4cd77bf0d3b847fd9ef969ba4da3705c5f5b","src/histogram/functional.rs":"22b2e64c3c1930e055beeebb832e3212e22b65b28e2ebb94c6bb3aff7ca31ba3","src/histogram/linear.rs":"bc33060cbbbb9c777539074cf5f788ab0f1a4ccecce0bf2cae2a697dd5089ea0","src/histogram/mod.rs":"c5eca9f6b0e1e309a7b41c2427d4c1da9c30e832d358d65ba347ba522abfd9c7","src/internal_metrics.rs":"54228cf409b4dd634fe0983f2619d2e0922efdd5fbce0f85a92454488967c854","src/internal_pings.rs":"3957a9fe256977a05d8d9e3beeec4c1fd08029db1c516fec4f6b59888e46ef39","src/lib.rs":"ac31e3136bd0077c33fe32554b39a0528a44396e4bb61d5a38b2978ffa52872b","src/lib_unit_tests.rs":"82ea06a5d6a8894c1670f99d0c236d8fa75eb9947fc8a1a53061a5e4c26b0b1d","src/metrics/boolean.rs":"2b9ef57e3582c9bd8b2cca8ab94c962a4871ecc00e837b913c9b0349ba9dff08","src/metrics/counter.rs":"b4a52a8167fb0edd6354f952525e59f3eadb4261de3483374f03c94449d30b92","src/metrics/custom_distribution.rs":"1ec4fd2ecebf547bef0ed28ae6854f641be447bcbf4066a8580f6af16a23e37f","src/metrics/datetime.rs":"e4405762fc71718299fa1b208e3d5fda654bd1b82fe908c884c284e3530de2ec","src/metrics/denominator.rs":"95e8442f90bad97f80fc74b146782f215344b52c5f3825ae0a8baffdc001a714","src/metrics/event.rs":"cd52e200d313e2e6f31707419d4a7fe1cab34916ee145f8136440d6da34aaad4","src/metrics/experiment.rs":"5f9278cca4e133eb8df33bbfe36d1fe0ef3eade8c09f1b46db3c4d0790515412","src/metrics/labeled.rs":"79acae98b7bd8536edcde5150c1402ed8560a8eb0ad5c04b79b7c67743d0aa71","src/metrics/memory_distribution.rs":"d3f02a6a78ed103024a2479975cd7617153e3f082e20f8f45c8e7afd052cec45","src/metrics/memory_unit.rs":"ee32e020cb303dd631457374048a3ed53a2e7cbacc29c54d17d836fb15507538","src/metrics/mod.rs":"777f89015c1642ed73536b07edc0763d179dbf608e2a0394439fe002cbc2fb53","src/metrics/numerator.rs":"937dfd583b797ac798a525cedca95c5a36262356760a89670d8113983c263154","src/metrics/object.rs":"2a1f1cc31973b576e55ba464b35c41b9420f62471eebba51273bca6856459538","src/metrics/ping.rs":"3b4524e8d17d55fe993746061636fb7d9566b51ac511765e173e7247907f0493","src/metrics/quantity.rs":"1315ae3216ebeec5b5a5baab88d63f88469875f538501e8320716516ef82bddf","src/metrics/rate.rs":"603cc45c149c7a27c93b6a80146bf43f8ce70d9655f905bb5be6bc2c15bcb22b","src/metrics/recorded_experiment.rs":"33958abee79d8b55dec4cb5d20742640423713010f76314075cefde18b5c118a","src/metrics/remote_settings_config.rs":"c85af9f9fef87ddfc578af4f2637c9bdcae18fbc6735ccc87a13a9b0ee0319ab","src/metrics/string.rs":"88beb1a847e5df9898b72ca7ed8ced3b7d2b40d83ff3670baf66f83a3e6cb005","src/metrics/string_list.rs":"ed53a095184c3e8224d0511809b5d7601ba3166505a39b0570f24ebeb0a5b97c","src/metrics/text.rs":"757f6919124d74e0512faa5bb9751a729b6bbc63ebe4d16ca81e9087f5595eaf","src/metrics/time_unit.rs":"4704703e19e799933aec3f39e3d3a125058756d7c7ba04f8729885c7843df447","src/metrics/timespan.rs":"e239c618f459c34f2799c73a4da3e3c6c0b2089ba42d584c2ddd12ed067586e6","src/metrics/timing_distribution.rs":"c61a2cd32a54e018b4b0bb60f030bada40fcbe68d6e6346eac8212cf416e14a3","src/metrics/url.rs":"589ae1f8047367ad8c19b57a48ca8130d5f36cf3ce5954124150f0eb89c620ea","src/metrics/uuid.rs":"cacffd95ab30ed327ec2fa5feaf1359e667706746401f1e2c1195ad9553c4b54","src/ping/mod.rs":"a4cc6b37443392aed79957a1b5d6943307e14bd3ead9fa9880c20aee48472ae2","src/scheduler.rs":"eb8131ed075e2d92bf0dc0a2c2a7e67c73bb61042d574c21965b1699cd1239aa","src/storage/mod.rs":"91f02556f113799e0d88d732ab342bda443f43461369e8b41c424c074d742591","src/system.rs":"e3d1b54e1d39cafe6f4dc7ff5021b08c879733f909951b0e1332b3efa9ed97bd","src/traits/boolean.rs":"be0e130f8043215705becc956d45b126c340568f1b24a396c0af9b4334a41ced","src/traits/counter.rs":"c686d26e131d854cd7a7df83c900ca7c17a03c663a30cf58ab48c7259476ce85","src/traits/custom_distribution.rs":"0bd1d425e4c059cca6af2dfb13c78e5e4c6c07fb46c7e31489ad0c5959854833","src/traits/datetime.rs":"636ac1456b1b042e38cf5ae6193c5b232ea0b80df62f583a2097891baef9641b","src/traits/event.rs":"a02235aae630aba7a45a3166b756927252b397af3ecdfab7236931e62725ac49","src/traits/labeled.rs":"1b2f8eea8d59e1635f64993936d880084a5e3f65cfd7a26ddf6968366890187d","src/traits/memory_distribution.rs":"55bb8f45e948319fbba9d28a50d8742da134b066a42e480887db7c7e435f4096","src/traits/mod.rs":"3560fdf3b81dceabbac9d97b0356aa8f883e477dcb787c81a09529047fda7161","src/traits/numerator.rs":"6e4f236bdc448f1bde7a8c249dcd086204c2c69990d3f444e746290929226ed3","src/traits/object.rs":"c03bad670ec7affbc578247f9e1904e898c1870b9bf25750c5094113f995623f","src/traits/ping.rs":"8831c106c03afeb458b0b028fa1ce61f056ebf8e82bc0a171a1bff255d920748","src/traits/quantity.rs":"6ffe25c913bef4315573d747308c182de740b2a4e02ba22cd21d0c33ba521f31","src/traits/rate.rs":"f000790440e0f389f0b160526a9a9a266e58d1405915ae56ac550f482858222c","src/traits/string.rs":"0c3c88382ff2e8eba89c7cfe129c4b84e31140af717819533c14919541ad790c","src/traits/string_list.rs":"14e56b62c2c2be1dd8013f12001f235b084abd2a0d5aa2f7932843877af49ac0","src/traits/text.rs":"8af7d3a0c87cfd8c6d33d6ad47532b431055bbdd395f9110da5630222c23cf93","src/traits/timespan.rs":"52be325a9c061916f34c5b638a07a93b4a14aa89fe365783103d2e06b998f547","src/traits/timing_distribution.rs":"0d35acddd9e35a7f8859cf007162460b5fd0bf06d205cd195ed1c857bbe58c42","src/traits/url.rs":"c27f7add23214ff051078b65b88120b620560d2841a1056c7214d5237e86b9e4","src/traits/uuid.rs":"81322e71c7e847bacaf827a2cd58f6193bdc208355524207f7f38db039da6aa8","src/upload/directory.rs":"363ddc345845c2d543f833a5a63f1c778455e68b36ac77ffce605cef29f0d5cb","src/upload/mod.rs":"edae31e4c2172fb1e8e8b2c5542812b1e29c3bfa2f1c7b08227cb7cc4260dd48","src/upload/policy.rs":"c250957a37783e74af8002cd80ba06ef9780a389fb0f61b8b665b79688f0a360","src/upload/request.rs":"de5532fc3d18e773330c05fe000643d87b9c4912a2d838099b8783538c5033ed","src/upload/result.rs":"c956266c54595d27d5e8b11abffe28fad5fea82995922618805b66cfdcc21d54","src/util.rs":"ee7500434d9758a320dd410f18d7e18da956591e19d2555db87eef9623e4b916","tests/boolean.rs":"76d6014ff108cb6514d9bceb1b2b14749a55b09921f4595a5e30f1bd3546e9f0","tests/collection_enabled.rs":"85f4b2eb49ac23437ae225ae2c44f354c952c24b7c806e2f2ee5dbe78e02c8db","tests/common/mod.rs":"a8f74c906dccfe747d5cf9dd83dd6e4d1ef25d0402d39a2d74105cddab80e54c","tests/counter.rs":"4c59def10e64de0d7a0241dde0267fd02c828b38be8cc67fba90a76004ca6721","tests/custom_distribution.rs":"41c593a0b4561e21f29d1a5b948de964a866253c58ca76ffefebe370fca150e0","tests/datetime.rs":"ec3c9760e70bb2cbc61ab23281c891bc1ec493c5c545466c29fd13e4f05c2c96","tests/event.rs":"5db675dad1bcbcee0451bfe5e93f05f28d7ef8098d19cd302c8bac262567cf0c","tests/labeled.rs":"3efddb05556e92a372f50a19b025ecf4ccd818c7c477250058db0706eb992079","tests/memory_distribution.rs":"3d9a5b8f99e03f783e3396e4320ee4dc974c895cfef2cec0b14d2a9a9f9b736f","tests/object.rs":"8c35676e04f6ccf54a28764700915e753fc0355bfa5d7804d72caba66fd564cd","tests/ping.rs":"eff68d3b47b04c58d8123214dd66e8d06d11f82ed3fd4f703224f84effb319bb","tests/ping_maker.rs":"64900bb24642127df559fa6ace4c7f0a4a4bf858321874c9b3758039df0ffa04","tests/quantity.rs":"55e7dca346fd1d27f0974b78ca3fb12427cb5da2ee637afc08a54f360f947361","tests/rate.rs":"94a3a7d0ccafea02a991ed9dd038cbfab8a534695b374b1ce6ed81285616e9f6","tests/storage.rs":"990dd1d13b9ffa8af0686977a6ac3502c6befb9eaa83649587e2660f51c596c9","tests/string.rs":"397fcfd27c25f0e81e2a40db3265b0d7dc0dd56b190319c1f86cb1c2c0ed4f9d","tests/string_list.rs":"34efa2afe3e89e6635f21ec9c80650d5816e35e9cb85163d894d600a5b3a4e3a","tests/text.rs":"1d43f6b90a43124311cacf0a6ee16f9e1e9263bcd11fee8b996d6efd81633638","tests/timespan.rs":"3d05739a93f3e0ea7264e8fdea876bd948714e5b44e82b8fd7c0218fdb597bb3","tests/timing_distribution.rs":"072ad950b2162e503150e411119b9a000573538bd2cff93c1c1a3616d1589ef4","tests/uuid.rs":"e0e58614319f5e973126f5b4e68d9289ccd6d65e428aca215bf7dcc8a0504889","uniffi.toml":"6ddc98b686b0925a81abd9d1c769e5c98ac29771b210a1c535931a46dec9a8e3"},"package":"5ca0df94fb37669287b77e8aa300913ad1d14426d7f9e443b0ce1185349c817e"} \ No newline at end of file diff --git a/third_party/rust/glean-core/Cargo.toml b/third_party/rust/glean-core/Cargo.toml index f4a8c1f6e9c..32ff1696c18 100644 --- a/third_party/rust/glean-core/Cargo.toml +++ b/third_party/rust/glean-core/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.82" name = "glean-core" -version = "64.0.1" +version = "64.1.1" authors = [ "Jan-Erik Rediger ", "The Glean Team ", @@ -40,7 +40,7 @@ license = "MPL-2.0" repository = "https://github.com/mozilla/glean" [package.metadata.glean] -glean-parser = "17.0.1" +glean-parser = "17.1.0" [lib] name = "glean_core" diff --git a/third_party/rust/glean-core/src/core/mod.rs b/third_party/rust/glean-core/src/core/mod.rs index 302f90d134e..d60af5363dc 100644 --- a/third_party/rust/glean-core/src/core/mod.rs +++ b/third_party/rust/glean-core/src/core/mod.rs @@ -24,8 +24,9 @@ use crate::storage::{StorageManager, INTERNAL_STORAGE}; use crate::upload::{PingUploadManager, PingUploadTask, UploadResult, UploadTaskAction}; use crate::util::{local_now_with_offset, sanitize_application_id}; use crate::{ - scheduler, system, CommonMetricData, ErrorKind, InternalConfiguration, Lifetime, PingRateLimit, - Result, DEFAULT_MAX_EVENTS, GLEAN_SCHEMA_VERSION, GLEAN_VERSION, KNOWN_CLIENT_ID, + scheduler, system, AttributionMetrics, CommonMetricData, DistributionMetrics, ErrorKind, + InternalConfiguration, Lifetime, PingRateLimit, Result, DEFAULT_MAX_EVENTS, + GLEAN_SCHEMA_VERSION, GLEAN_VERSION, KNOWN_CLIENT_ID, }; static GLEAN: OnceCell> = OnceCell::new(); @@ -1084,4 +1085,76 @@ impl Glean { scheduler::schedule(self); } } + + /// Updates attribution fields with new values. + /// AttributionMetrics fields with `None` values will not overwrite older values. + pub fn update_attribution(&self, attribution: AttributionMetrics) { + if let Some(source) = attribution.source { + self.core_metrics.attribution_source.set_sync(self, source); + } + if let Some(medium) = attribution.medium { + self.core_metrics.attribution_medium.set_sync(self, medium); + } + if let Some(campaign) = attribution.campaign { + self.core_metrics + .attribution_campaign + .set_sync(self, campaign); + } + if let Some(term) = attribution.term { + self.core_metrics.attribution_term.set_sync(self, term); + } + if let Some(content) = attribution.content { + self.core_metrics + .attribution_content + .set_sync(self, content); + } + } + + /// **TEST-ONLY Method** + /// + /// Returns the current attribution metrics. + pub fn test_get_attribution(&self) -> AttributionMetrics { + AttributionMetrics { + source: self + .core_metrics + .attribution_source + .get_value(self, Some("glean_client_info")), + medium: self + .core_metrics + .attribution_medium + .get_value(self, Some("glean_client_info")), + campaign: self + .core_metrics + .attribution_campaign + .get_value(self, Some("glean_client_info")), + term: self + .core_metrics + .attribution_term + .get_value(self, Some("glean_client_info")), + content: self + .core_metrics + .attribution_content + .get_value(self, Some("glean_client_info")), + } + } + + /// Updates distribution fields with new values. + /// DistributionMetrics fields with `None` values will not overwrite older values. + pub fn update_distribution(&self, distribution: DistributionMetrics) { + if let Some(name) = distribution.name { + self.core_metrics.distribution_name.set_sync(self, name); + } + } + + /// **TEST-ONLY Method** + /// + /// Returns the current distribution metrics. + pub fn test_get_distribution(&self) -> DistributionMetrics { + DistributionMetrics { + name: self + .core_metrics + .distribution_name + .get_value(self, Some("glean_client_info")), + } + } } diff --git a/third_party/rust/glean-core/src/core_metrics.rs b/third_party/rust/glean-core/src/core_metrics.rs index baa2b8515bc..c3ed9f2ec45 100644 --- a/third_party/rust/glean-core/src/core_metrics.rs +++ b/third_party/rust/glean-core/src/core_metrics.rs @@ -42,6 +42,58 @@ pub struct ClientInfoMetrics { pub locale: Option, } +/// Optional product attribution metrics carried in `client_info.attribution`. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct AttributionMetrics { + /// The attribution source (e.g. "google-play"). + pub source: Option, + /// The attribution medium (e.g. "organic" for a search engine). + pub medium: Option, + /// The attribution campaign (e.g. "mozilla-org"). + pub campaign: Option, + /// The attribution term (e.g. "browser with developer tools for android"). + pub term: Option, + /// The attribution content (e.g. "firefoxview"). + pub content: Option, +} + +impl AttributionMetrics { + /// Update self with any non-`None` fields from `other`. + pub fn update(&mut self, other: AttributionMetrics) { + if let Some(source) = other.source { + self.source = Some(source); + } + if let Some(medium) = other.medium { + self.medium = Some(medium); + } + if let Some(campaign) = other.campaign { + self.campaign = Some(campaign); + } + if let Some(term) = other.term { + self.term = Some(term); + } + if let Some(content) = other.content { + self.content = Some(content); + } + } +} + +/// Optional product distribution metrics carried in `client_info.distribution`. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct DistributionMetrics { + /// The distribution name (e.g. "MozillaOnline"). + pub name: Option, +} + +impl DistributionMetrics { + /// Update self with any non-`None` fields from `other`. + pub fn update(&mut self, other: DistributionMetrics) { + if let Some(name) = other.name { + self.name = Some(name); + } + } +} + /// Metrics included in every ping as `client_info`. impl ClientInfoMetrics { /// Creates the client info with dummy values for all. @@ -204,3 +256,62 @@ pub mod internal_metrics { ) }); } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn update_attribution() { + let mut attr: AttributionMetrics = Default::default(); + let empty: AttributionMetrics = Default::default(); + + // Ensure the identity operation works. + attr.update(empty.clone()); + assert_eq!(None, attr.source); + + // Ensure simple updates work. + attr.update(AttributionMetrics { + source: Some("a source".into()), + ..Default::default() + }); + assert_eq!(Some("a source".into()), attr.source); + + // Ensure None doesn't overwrite. + attr.update(empty); + assert_eq!(Some("a source".into()), attr.source); + + // Ensure updates of Some work. + attr.update(AttributionMetrics { + source: Some("another source".into()), + ..Default::default() + }); + assert_eq!(Some("another source".into()), attr.source); + } + + #[test] + fn update_distribution() { + let mut dist: DistributionMetrics = Default::default(); + let empty: DistributionMetrics = Default::default(); + + // Ensure the identity operation works. + dist.update(empty.clone()); + assert_eq!(None, dist.name); + + // Ensure simple updates work. + dist.update(DistributionMetrics { + name: Some("a name".into()), + }); + assert_eq!(Some("a name".into()), dist.name); + + // Ensure None doesn't overwrite. + dist.update(empty); + assert_eq!(Some("a name".into()), dist.name); + + // Ensure updates of Some work. + dist.update(DistributionMetrics { + name: Some("another name".into()), + }); + assert_eq!(Some("another name".into()), dist.name); + } +} diff --git a/third_party/rust/glean-core/src/glean.udl b/third_party/rust/glean-core/src/glean.udl index d8f3aa17905..fb7cdfe69e2 100644 --- a/third_party/rust/glean-core/src/glean.udl +++ b/third_party/rust/glean-core/src/glean.udl @@ -71,6 +71,18 @@ namespace glean { PingUploadTask glean_get_upload_task(); UploadTaskAction glean_process_ping_upload_response(string uuid, UploadResult result); + + // Updates attribution fields with new values. + // AttributionMetrics fields with no values will not overwrite older values. + void glean_update_attribution(AttributionMetrics attribution); + // Returns the current attribution metrics, if any. + AttributionMetrics glean_test_get_attribution(); + + // Updates distribution fields with new values. + // DistributionMetrics fields with no values will not overwrite older values. + void glean_update_distribution(DistributionMetrics distribution); + // Returns the current distribution metrics, if any. + DistributionMetrics glean_test_get_distribution(); }; // A `Cow<'static, str>`, but really it's always the owned part. @@ -138,6 +150,18 @@ dictionary ClientInfoMetrics { i64? windows_build_number = null; }; +dictionary AttributionMetrics { + string? source = null; + string? medium = null; + string? campaign = null; + string? term = null; + string? content = null; +}; + +dictionary DistributionMetrics { + string? name = null; +}; + [Error] enum CallbackError { "UnexpectedError", diff --git a/third_party/rust/glean-core/src/internal_metrics.rs b/third_party/rust/glean-core/src/internal_metrics.rs index 7c0f697eed6..372ec32a9ad 100644 --- a/third_party/rust/glean-core/src/internal_metrics.rs +++ b/third_party/rust/glean-core/src/internal_metrics.rs @@ -11,6 +11,12 @@ pub struct CoreMetrics { pub client_id: UuidMetric, pub first_run_date: DatetimeMetric, pub os: StringMetric, + pub attribution_source: StringMetric, + pub attribution_medium: StringMetric, + pub attribution_campaign: StringMetric, + pub attribution_term: StringMetric, + pub attribution_content: StringMetric, + pub distribution_name: StringMetric, } #[derive(Debug)] @@ -65,6 +71,60 @@ impl CoreMetrics { disabled: false, dynamic_label: None, }), + + attribution_source: StringMetric::new(CommonMetricData { + name: "source".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + attribution_medium: StringMetric::new(CommonMetricData { + name: "medium".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + attribution_campaign: StringMetric::new(CommonMetricData { + name: "campaign".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + attribution_term: StringMetric::new(CommonMetricData { + name: "term".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + attribution_content: StringMetric::new(CommonMetricData { + name: "content".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + distribution_name: StringMetric::new(CommonMetricData { + name: "name".into(), + category: "distribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), } } } diff --git a/third_party/rust/glean-core/src/lib.rs b/third_party/rust/glean-core/src/lib.rs index aac594e2099..50da8bb8dfa 100644 --- a/third_party/rust/glean-core/src/lib.rs +++ b/third_party/rust/glean-core/src/lib.rs @@ -59,7 +59,7 @@ mod fd_logger; pub use crate::common_metric_data::{CommonMetricData, Lifetime}; pub use crate::core::Glean; -pub use crate::core_metrics::ClientInfoMetrics; +pub use crate::core_metrics::{AttributionMetrics, ClientInfoMetrics, DistributionMetrics}; pub use crate::error::{Error, ErrorKind, Result}; pub use crate::error_recording::{test_get_num_recorded_errors, ErrorType}; pub use crate::histogram::HistogramType; @@ -102,6 +102,10 @@ static PRE_INIT_SOURCE_TAGS: Mutex> = Mutex::new(Vec::new()); static PRE_INIT_PING_REGISTRATION: Mutex> = Mutex::new(Vec::new()); static PRE_INIT_PING_ENABLED: Mutex> = Mutex::new(Vec::new()); +/// Keep track of attribution and distribution supplied before Glean is initialized. +static PRE_INIT_ATTRIBUTION: Mutex> = Mutex::new(None); +static PRE_INIT_DISTRIBUTION: Mutex> = Mutex::new(None); + /// Global singleton of the handles of the glean.init threads. /// For joining. For tests. /// (Why a Vec? There might be more than one concurrent call to initialize.) @@ -448,6 +452,15 @@ fn initialize_inner( glean.set_ping_enabled(ping, *enabled); } + // The attribution and distribution might have been set before initialize, + // take the cached values and set them. + if let Some(attribution) = PRE_INIT_ATTRIBUTION.lock().unwrap().take() { + glean.update_attribution(attribution); + } + if let Some(distribution) = PRE_INIT_DISTRIBUTION.lock().unwrap().take() { + glean.update_distribution(distribution); + } + // If this is the first time ever the Glean SDK runs, make sure to set // some initial core metrics in case we need to generate early pings. // The next times we start, we would have them around already. @@ -874,7 +887,7 @@ pub fn glean_set_collection_enabled(enabled: bool) { /// and all pending pings of that type to be deleted. pub fn set_ping_enabled(ping: &PingType, enabled: bool) { let ping = ping.clone(); - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { crate::launch_with_glean_mut(move |glean| glean.set_ping_enabled(&ping, enabled)); } else { let m = &PRE_INIT_PING_ENABLED; @@ -889,7 +902,7 @@ pub(crate) fn register_ping_type(ping: &PingType) { // we dispatch ping registration on the thread pool. // Registering a ping should not block the application. // Submission itself is also dispatched, so it will always come after the registration. - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { let ping = ping.clone(); crate::launch_with_glean_mut(move |glean| { glean.register_ping_type(&ping); @@ -1003,7 +1016,7 @@ pub fn glean_apply_server_knobs_config(json: String) { /// This will return `false` in case `tag` is not a valid tag and `true` otherwise. /// If called before Glean is initialized it will always return `true`. pub fn glean_set_debug_view_tag(tag: String) -> bool { - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { crate::launch_with_glean_mut(move |glean| { glean.set_debug_view_tag(&tag); }); @@ -1041,7 +1054,7 @@ pub fn glean_get_debug_view_tag() -> Option { /// * `tags` - A vector of at most 5 valid HTTP header values. Individual /// tags must match the regex: "[a-zA-Z0-9-]{1,20}". pub fn glean_set_source_tags(tags: Vec) -> bool { - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { crate::launch_with_glean_mut(|glean| { glean.set_source_tags(tags); }); @@ -1066,7 +1079,7 @@ pub fn glean_set_source_tags(tags: Vec) -> bool { /// /// * `value` - The value of the log pings option pub fn glean_set_log_pings(value: bool) { - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { crate::launch_with_glean_mut(move |glean| { glean.set_log_pings(value); }); @@ -1163,7 +1176,8 @@ pub fn glean_submit_ping_by_name_sync(ping_name: String, reason: Option) return false; } - core::with_glean(|glean| glean.submit_ping_by_name(&ping_name, reason.as_deref())) + core::with_opt_glean(|glean| glean.submit_ping_by_name(&ping_name, reason.as_deref())) + .unwrap_or(false) } /// EXPERIMENTAL: Register a listener object to recieve notifications of event recordings. @@ -1255,6 +1269,52 @@ pub fn glean_set_dirty_flag(new_value: bool) { core::with_glean(|glean| glean.set_dirty_flag(new_value)) } +/// Updates attribution fields with new values. +/// AttributionMetrics fields with `None` values will not overwrite older values. +pub fn glean_update_attribution(attribution: AttributionMetrics) { + if was_initialize_called() && core::global_glean().is_some() { + core::with_glean(|glean| glean.update_attribution(attribution)); + } else { + PRE_INIT_ATTRIBUTION + .lock() + .unwrap() + .get_or_insert(Default::default()) + .update(attribution); + } +} + +/// **TEST-ONLY Method** +/// +/// Returns the current attribution metrics. +/// Panics if called before init. +pub fn glean_test_get_attribution() -> AttributionMetrics { + join_init(); + core::with_glean(|glean| glean.test_get_attribution()) +} + +/// Updates distribution fields with new values. +/// DistributionMetrics fields with `None` values will not overwrite older values. +pub fn glean_update_distribution(distribution: DistributionMetrics) { + if was_initialize_called() && core::global_glean().is_some() { + core::with_glean(|glean| glean.update_distribution(distribution)); + } else { + PRE_INIT_DISTRIBUTION + .lock() + .unwrap() + .get_or_insert(Default::default()) + .update(distribution); + } +} + +/// **TEST-ONLY Method** +/// +/// Returns the current distribution metrics. +/// Panics if called before init. +pub fn glean_test_get_distribution() -> DistributionMetrics { + join_init(); + core::with_glean(|glean| glean.test_get_distribution()) +} + #[cfg(all(not(target_os = "android"), not(target_os = "ios")))] static FD_LOGGER: OnceCell = OnceCell::new(); diff --git a/third_party/rust/glean-core/src/lib_unit_tests.rs b/third_party/rust/glean-core/src/lib_unit_tests.rs index 005cf92b416..5b17597f3e4 100644 --- a/third_party/rust/glean-core/src/lib_unit_tests.rs +++ b/third_party/rust/glean-core/src/lib_unit_tests.rs @@ -396,6 +396,58 @@ fn client_id_is_set_to_random_value_when_uploading_enabled_at_start() { assert_ne!(*KNOWN_CLIENT_ID, current_client_id.unwrap()); } +#[test] +fn attribution_and_distribution_are_correctly_stored() { + let dir = tempfile::tempdir().unwrap(); + let tmpname = dir.path().display().to_string(); + let glean = Glean::with_options(&tmpname, GLOBAL_APPLICATION_ID, true, true); + + // On a fresh Glean, no attribution or distribution information is set. + assert_eq!( + ::default(), + glean.test_get_attribution() + ); + assert_eq!( + ::default(), + glean.test_get_distribution() + ); + + let mut attribution = AttributionMetrics { + source: Some("source".into()), + medium: Some("medium".into()), + campaign: Some("campaign".into()), + term: Some("term".into()), + content: Some("content".into()), + }; + let distribution = DistributionMetrics { + name: Some("name".into()), + }; + + // Set them all at once. + glean.update_attribution(attribution.clone()); + glean.update_distribution(distribution.clone()); + + assert_eq!(attribution, glean.test_get_attribution()); + assert_eq!(distribution, glean.test_get_distribution()); + + let attribution_update = AttributionMetrics { + campaign: Some("new campaign".into()), + ..Default::default() + }; + let distribution_update = DistributionMetrics { + name: Some("new name".into()), + }; + + // Perform updates. + glean.update_attribution(attribution_update); + glean.update_distribution(distribution_update.clone()); + + // Ensure only the updated fields took over + attribution.campaign = Some("new campaign".into()); + assert_eq!(attribution, glean.test_get_attribution()); + assert_eq!(distribution_update, glean.test_get_distribution()); +} + #[test] fn enabling_when_already_enabled_is_a_noop() { let dir = tempfile::tempdir().unwrap(); diff --git a/third_party/rust/glean-core/src/metrics/labeled.rs b/third_party/rust/glean-core/src/metrics/labeled.rs index 4824a6999d0..fd15e4c18b8 100644 --- a/third_party/rust/glean-core/src/metrics/labeled.rs +++ b/third_party/rust/glean-core/src/metrics/labeled.rs @@ -17,7 +17,7 @@ use crate::Glean; const MAX_LABELS: usize = 16; const OTHER_LABEL: &str = "__other__"; -const MAX_LABEL_LENGTH: usize = 71; +const MAX_LABEL_LENGTH: usize = 111; /// A labeled counter. pub type LabeledCounter = LabeledMetric; @@ -265,7 +265,7 @@ where /// only the first 16 unique labels will be used. /// After that, any additional labels will be recorded under the special `OTHER_LABEL` label. /// - /// Labels must be `snake_case` and less than 30 characters. + /// Labels must have a maximum of 111 characters, and may comprise any printable ASCII characters. /// If an invalid label is used, the metric will be recorded in the special `OTHER_LABEL` label. pub fn get>(&self, label: S) -> Arc { let label = label.as_ref(); diff --git a/third_party/rust/glean-core/src/ping/mod.rs b/third_party/rust/glean-core/src/ping/mod.rs index 089c38d8caf..cd52427c474 100644 --- a/third_party/rust/glean-core/src/ping/mod.rs +++ b/third_party/rust/glean-core/src/ping/mod.rs @@ -176,8 +176,36 @@ impl PingMaker { StorageManager.snapshot_as_json(glean.storage(), "glean_client_info", true) { let client_info_obj = client_info.as_object().unwrap(); // safe unwrap, snapshot always returns an object. - for (_key, value) in client_info_obj { - merge(&mut map, value); + for (_metric_type, metrics) in client_info_obj { + merge(&mut map, metrics); + } + let map = map.as_object_mut().unwrap(); // safe unwrap, we created the object above. + let mut attribution = serde_json::Map::new(); + let mut distribution = serde_json::Map::new(); + map.retain(|name, value| { + // Only works because we ensure no client_info metric categories contain '.'. + let mut split = name.split('.'); + let category = split.next(); + let name = split.next(); + if let (Some(category), Some(name)) = (category, name) { + if category == "attribution" { + attribution.insert(name.into(), value.take()); + false + } else if category == "distribution" { + distribution.insert(name.into(), value.take()); + false + } else { + true + } + } else { + true + } + }); + if !attribution.is_empty() { + map.insert("attribution".into(), serde_json::Value::from(attribution)); + } + if !distribution.is_empty() { + map.insert("distribution".into(), serde_json::Value::from(distribution)); } } else { log::warn!("Empty client info data."); diff --git a/third_party/rust/glean-core/src/traits/labeled.rs b/third_party/rust/glean-core/src/traits/labeled.rs index 2979ee2ee90..54f937a2386 100644 --- a/third_party/rust/glean-core/src/traits/labeled.rs +++ b/third_party/rust/glean-core/src/traits/labeled.rs @@ -21,7 +21,7 @@ where /// only the first 16 unique labels will be used. /// After that, any additional labels will be recorded under the special `OTHER_LABEL` label. /// - /// Labels must be `snake_case` and less than 30 characters. + /// Labels must have a maximum of 111 characters, and may comprise any printable ASCII characters. /// If an invalid label is used, the metric will be recorded in the special `OTHER_LABEL` label. fn get(&self, label: &str) -> T; diff --git a/third_party/rust/glean-core/tests/labeled.rs b/third_party/rust/glean-core/tests/labeled.rs index 69687d3737f..bd999c4d515 100644 --- a/third_party/rust/glean-core/tests/labeled.rs +++ b/third_party/rust/glean-core/tests/labeled.rs @@ -387,7 +387,7 @@ fn dynamic_labels_too_long() { None, ); - let metric = labeled.get("1".repeat(72)); + let metric = labeled.get("1".repeat(112)); metric.add_sync(&glean, 1); let snapshot = StorageManager diff --git a/third_party/rust/glean-core/tests/ping_maker.rs b/third_party/rust/glean-core/tests/ping_maker.rs index 2d51f648b4d..6cd15b62f47 100644 --- a/third_party/rust/glean-core/tests/ping_maker.rs +++ b/third_party/rust/glean-core/tests/ping_maker.rs @@ -4,6 +4,8 @@ mod common; use crate::common::*; +use glean_core::{AttributionMetrics, DistributionMetrics}; +use serde_json::json; use glean_core::metrics::*; use glean_core::ping::PingMaker; @@ -306,3 +308,69 @@ fn metadata_is_correctly_added_when_necessary() { let headers = metadata.as_ref().unwrap().get("headers").unwrap(); assert_eq!(headers.get("X-Debug-ID").unwrap(), "valid-tag"); } + +#[test] +fn attribution_and_distribution_appear_in_client_info() { + let (glean, ping_maker, ping_type, _t) = set_up_basic_ping(); + + let attribution = AttributionMetrics { + source: Some("source".into()), + medium: Some("medium".into()), + campaign: Some("campaign".into()), + term: Some("term".into()), + content: Some("content".into()), + }; + let distribution = DistributionMetrics { + name: Some("name".into()), + }; + glean.update_attribution(attribution); + glean.update_distribution(distribution); + + let ping = ping_maker + .collect(&glean, &ping_type, None, "", "") + .unwrap(); + let client_info = ping.content["client_info"].as_object().unwrap(); + + assert_eq!(json!({"name": "name"}), client_info["distribution"]); + assert_eq!( + json!({ + "source": "source", + "medium": "medium", + "campaign": "campaign", + "term": "term", + "content": "content", + }), + client_info["attribution"] + ); + + // Now let's test updated values. + let attribution_update = AttributionMetrics { + content: Some("what a boring word".into()), + ..Default::default() + }; + let distribution_update = DistributionMetrics { + name: Some("what's in a name".into()), + }; + glean.update_attribution(attribution_update); + glean.update_distribution(distribution_update); + + let ping = ping_maker + .collect(&glean, &ping_type, None, "", "") + .unwrap(); + let client_info = ping.content["client_info"].as_object().unwrap(); + + assert_eq!( + json!({"name": "what's in a name"}), + client_info["distribution"] + ); + assert_eq!( + json!({ + "source": "source", + "medium": "medium", + "campaign": "campaign", + "term": "term", + "content": "what a boring word", + }), + client_info["attribution"] + ); +} diff --git a/third_party/rust/glean/.cargo-checksum.json b/third_party/rust/glean/.cargo-checksum.json index 794bfa5e8c9..ad172ae53bd 100644 --- a/third_party/rust/glean/.cargo-checksum.json +++ b/third_party/rust/glean/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"61c7d6620026e84a7bb067305d92ffb8c51a59261c339d3ef6a8406d03bbfd92","Cargo.toml":"bec966c61ac0670d367556c54f9156aad7b2cd72dce2d09c783fdf421f49c563","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"5627cc81e6187ab6c2b4dff061af16d559edcab64ba786bac39daa69c703c595","src/common_test.rs":"c86cccfb7da1506cfed29cb2ee13d839b7ac7cffdfd70793c9665bb44e0b684f","src/configuration.rs":"de65ab99a26b4547be20803bc195cb50a6ab40b1a3f49a2e6230fed5a9d7a8d8","src/core_metrics.rs":"fef8fb4e5fa57c179836c6eb2cf59278fe3b8b036dbe57b0ff02971b4acd822f","src/lib.rs":"61b56a35c2bc6cd60bba2225b399881512d4b9a7d8cadca7fbed37ee6959d74c","src/net/http_uploader.rs":"0a94ac3cd87cb021529dee46d537765ab8d923e0f4ac7615225e878d3739e6dc","src/net/mod.rs":"09ba010b03d045fd8a2ccbe4f205c5275bb622bceb34cb81a0aa8f7d33804e2e","src/private/event.rs":"f299c79e4e2acb657f06004f3038bd8909e287719458566bc7f96262d8665e62","src/private/mod.rs":"66e90c41de74d1e80c5d3f49b8f1a86b8396be0b8c4a80f1a28903fe6d105ecf","src/private/object.rs":"7f17a7a658e8f7aa19a6bedf70f60f3f42713316d5d60298d682bb045caaafb7","src/private/ping.rs":"d2fb45e9e178ff6b17aa9c1b5258dfcd2ed91a2b43b44dec826de256ef5e8520","src/system.rs":"d602804a72258bfd65e51c571946631732ee27d81342d8aa406e47fdd241bbfa","src/test.rs":"bfbea9416dfdc96ebc1f9af5005b5b23f2285b74ef82c74cdab11635322ea3e3","tests/collection_enabled.rs":"3327a949dbdeec493d661261abda68ffa71acc50ab24cba4fde5302749e6f16b","tests/collection_enabled_bin.rs":"d3a6458b84012a447e5cb792f2292a06951ed252fad803b9166b437bacba542c","tests/common/mod.rs":"2fd391c5eb45f56fdfa3261dd631406c67ed36b10b0d5432febe2483da5c9d89","tests/custom_distribution_buffered.rs":"47c13d1f39adf3881e10caa19e0c08235f08958809e234bf37a79d37d7322cd5","tests/init_fails.rs":"ca7fa1b3dd6a21a9e005b7a4f0a18664c4bceb952dd463db8316500f72280d5b","tests/interruptible_shutdown.rs":"3d954bbe47d4f5fd103c51a4ff99f151662143c25c826da9734a00cd215909b9","tests/memory_distribution_buffered.rs":"db487475a5cf17a0864ccf150984ebdd28bf616573772cf678246cc1bdbcbc0f","tests/metric_metadata.rs":"05c947d3decf0a3281378dbb108080a05319ad8f130af5b07f9b049b80e5f04f","tests/near-empty-c0ffee-db.safe.bin":"89afb3bb8fc94430fb0ed0fe55f85f3f8bcc8fd0fed69a9df13cc560294ec9f5","tests/never_init.rs":"51fff5618f6603bc0945d70131698d10a1c6275f43bbc22a2de5807f8a79229f","tests/no_time_to_init.rs":"2ede23df6618ff1cb5ae3b7bbf95900ad0fd92072afa2e0319bf147b4f75cefc","tests/overflowing_preinit.rs":"985e140460a100986fd051ce901b787a3a7a9747a856cd06066b740ac7d2381c","tests/persist_ping_lifetime_nopanic.rs":"18379d3ffbf4a2c8c684c04ff7a0660b86dfbbb447db2d24dfed6073cb7ddf8f","tests/schema.rs":"23b49005402b914e55a0c5c155f30c2662c609f79be78d1385ec25b3600b3547","tests/simple.rs":"15c76a1b5a336fd6abfbdebafc971f5c6a9b75107ddbca65f0031cde3e2886da","tests/test-delayed-ping-data.sh":"4a6db98b4df6b77898ace6a8b4e8b4c60d3e5c44873bbf38c62e83583e27a3ff","tests/test-enabled-pings.sh":"06656e38f63e65475006b107dd6bd179b0cbaa1fad1470de38e679e91a9315a3","tests/test-pending-gets-removed.sh":"e335f2f00fa97a61b6d94e0005fb3b9de8c8db8076111a67ca47d85392039ea9","tests/test-ping-lifetime-flush.sh":"e8f118ea2f6fd973809e38d5e828a03cfccfe0b0f497ccde5ec92d6d1380c071","tests/test-shutdown-blocking.sh":"a44d8d4bbe2ee3ede9e48121150ae7a5386025160c5cef2181ca142232c5fb27","tests/test-thread-crashing.sh":"f3cd0cc8a7b4fe82bef0fe6fbfbbe45fbad6da3afe0f82578bc5cfb2d6527ac6","tests/timing_distribution_buffered.rs":"501f7289c0c28f0ab83838c88b058999b19436d0f2b693be0787513d7b67e06d","tests/timing_distribution_single_sample.rs":"4f9498b6ef29913da0356027efe5f572c81d2f426e8538c068b54a1cfa33c1b8","tests/upload_timing.rs":"b3b9db197bc2ec41556388969a6bf289e7ef19e05b9019bc2bd98c823fcf6ea3","tests/uploader_capabilities.rs":"347f19e534a50a211ea179d6818631270d1b4ec468098e6b6abcde1e4a6a9bca"},"package":"251b9cb685554b96dcf785dba69ce90447006dd6d9229db783336c981c3777e1"} \ No newline at end of file +{"files":{"Cargo.lock":"add20d32d164cac0a56ddac41468eaf0b23b9616f32e94a8434f5841d14b3a97","Cargo.toml":"99107d6ac4ef4ff33e2d206e8498875df879001e4621ba94e9d4ccf14267f39c","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"5627cc81e6187ab6c2b4dff061af16d559edcab64ba786bac39daa69c703c595","src/common_test.rs":"c86cccfb7da1506cfed29cb2ee13d839b7ac7cffdfd70793c9665bb44e0b684f","src/configuration.rs":"de65ab99a26b4547be20803bc195cb50a6ab40b1a3f49a2e6230fed5a9d7a8d8","src/core_metrics.rs":"fef8fb4e5fa57c179836c6eb2cf59278fe3b8b036dbe57b0ff02971b4acd822f","src/lib.rs":"998359d04ba0f71aaa360b8999c716f22c9efaf1ff4e1fdce80f1d3af5e584b0","src/net/http_uploader.rs":"0a94ac3cd87cb021529dee46d537765ab8d923e0f4ac7615225e878d3739e6dc","src/net/mod.rs":"09ba010b03d045fd8a2ccbe4f205c5275bb622bceb34cb81a0aa8f7d33804e2e","src/private/event.rs":"f299c79e4e2acb657f06004f3038bd8909e287719458566bc7f96262d8665e62","src/private/mod.rs":"66e90c41de74d1e80c5d3f49b8f1a86b8396be0b8c4a80f1a28903fe6d105ecf","src/private/object.rs":"7f17a7a658e8f7aa19a6bedf70f60f3f42713316d5d60298d682bb045caaafb7","src/private/ping.rs":"d2fb45e9e178ff6b17aa9c1b5258dfcd2ed91a2b43b44dec826de256ef5e8520","src/system.rs":"d602804a72258bfd65e51c571946631732ee27d81342d8aa406e47fdd241bbfa","src/test.rs":"8ff4d5072d23d9fbf5444e474d21b41a31e86a37e2a25fc2f2a92976e7642cbb","tests/collection_enabled.rs":"3327a949dbdeec493d661261abda68ffa71acc50ab24cba4fde5302749e6f16b","tests/collection_enabled_bin.rs":"d3a6458b84012a447e5cb792f2292a06951ed252fad803b9166b437bacba542c","tests/common/mod.rs":"2fd391c5eb45f56fdfa3261dd631406c67ed36b10b0d5432febe2483da5c9d89","tests/custom_distribution_buffered.rs":"47c13d1f39adf3881e10caa19e0c08235f08958809e234bf37a79d37d7322cd5","tests/init_fails.rs":"ca7fa1b3dd6a21a9e005b7a4f0a18664c4bceb952dd463db8316500f72280d5b","tests/interruptible_shutdown.rs":"3d954bbe47d4f5fd103c51a4ff99f151662143c25c826da9734a00cd215909b9","tests/memory_distribution_buffered.rs":"db487475a5cf17a0864ccf150984ebdd28bf616573772cf678246cc1bdbcbc0f","tests/metric_metadata.rs":"05c947d3decf0a3281378dbb108080a05319ad8f130af5b07f9b049b80e5f04f","tests/near-empty-c0ffee-db.safe.bin":"89afb3bb8fc94430fb0ed0fe55f85f3f8bcc8fd0fed69a9df13cc560294ec9f5","tests/never_init.rs":"51fff5618f6603bc0945d70131698d10a1c6275f43bbc22a2de5807f8a79229f","tests/no_time_to_init.rs":"2ede23df6618ff1cb5ae3b7bbf95900ad0fd92072afa2e0319bf147b4f75cefc","tests/overflowing_preinit.rs":"985e140460a100986fd051ce901b787a3a7a9747a856cd06066b740ac7d2381c","tests/persist_ping_lifetime_nopanic.rs":"18379d3ffbf4a2c8c684c04ff7a0660b86dfbbb447db2d24dfed6073cb7ddf8f","tests/schema.rs":"23b49005402b914e55a0c5c155f30c2662c609f79be78d1385ec25b3600b3547","tests/simple.rs":"15c76a1b5a336fd6abfbdebafc971f5c6a9b75107ddbca65f0031cde3e2886da","tests/test-delayed-ping-data.sh":"4a6db98b4df6b77898ace6a8b4e8b4c60d3e5c44873bbf38c62e83583e27a3ff","tests/test-enabled-pings.sh":"06656e38f63e65475006b107dd6bd179b0cbaa1fad1470de38e679e91a9315a3","tests/test-pending-gets-removed.sh":"e335f2f00fa97a61b6d94e0005fb3b9de8c8db8076111a67ca47d85392039ea9","tests/test-ping-lifetime-flush.sh":"e8f118ea2f6fd973809e38d5e828a03cfccfe0b0f497ccde5ec92d6d1380c071","tests/test-shutdown-blocking.sh":"a44d8d4bbe2ee3ede9e48121150ae7a5386025160c5cef2181ca142232c5fb27","tests/test-thread-crashing.sh":"f3cd0cc8a7b4fe82bef0fe6fbfbbe45fbad6da3afe0f82578bc5cfb2d6527ac6","tests/timing_distribution_buffered.rs":"501f7289c0c28f0ab83838c88b058999b19436d0f2b693be0787513d7b67e06d","tests/timing_distribution_single_sample.rs":"4f9498b6ef29913da0356027efe5f572c81d2f426e8538c068b54a1cfa33c1b8","tests/upload_timing.rs":"b3b9db197bc2ec41556388969a6bf289e7ef19e05b9019bc2bd98c823fcf6ea3","tests/uploader_capabilities.rs":"347f19e534a50a211ea179d6818631270d1b4ec468098e6b6abcde1e4a6a9bca"},"package":"95024f4707705270208e36983976cbac235dd7fc33c9f1cb0dee396ec1ce295d"} \ No newline at end of file diff --git a/third_party/rust/glean/Cargo.lock b/third_party/rust/glean/Cargo.lock index 728b31a6e9d..012b87a0b21 100644 --- a/third_party/rust/glean/Cargo.lock +++ b/third_party/rust/glean/Cargo.lock @@ -135,9 +135,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -242,7 +242,7 @@ dependencies = [ [[package]] name = "glean" -version = "64.0.1" +version = "64.1.1" dependencies = [ "crossbeam-channel", "env_logger", @@ -260,9 +260,9 @@ dependencies = [ [[package]] name = "glean-core" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49d1d62648ddeed8cb996373046ea45de93f1d1ff956aba054b9304bc305753" +checksum = "5ca0df94fb37669287b77e8aa300913ad1d14426d7f9e443b0ce1185349c817e" dependencies = [ "android_logger", "bincode", diff --git a/third_party/rust/glean/Cargo.toml b/third_party/rust/glean/Cargo.toml index 7b7c3937b8f..4af49a88bec 100644 --- a/third_party/rust/glean/Cargo.toml +++ b/third_party/rust/glean/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.82" name = "glean" -version = "64.0.1" +version = "64.1.1" authors = [ "Jan-Erik Rediger ", "The Glean Team ", @@ -115,7 +115,7 @@ path = "tests/uploader_capabilities.rs" version = "0.5" [dependencies.glean-core] -version = "64.0.1" +version = "64.1.1" [dependencies.inherent] version = "1" diff --git a/third_party/rust/glean/src/lib.rs b/third_party/rust/glean/src/lib.rs index d0fd006dbf3..62ec3204014 100644 --- a/third_party/rust/glean/src/lib.rs +++ b/third_party/rust/glean/src/lib.rs @@ -39,8 +39,8 @@ pub use glean_core::{ Datetime, DistributionData, MemoryUnit, MetricIdentifier, Rate, RecordedEvent, TimeUnit, TimerId, }, - traits, CommonMetricData, Error, ErrorType, Glean, HistogramType, LabeledMetricData, Lifetime, - PingRateLimit, RecordedExperiment, Result, + traits, AttributionMetrics, CommonMetricData, DistributionMetrics, Error, ErrorType, Glean, + HistogramType, LabeledMetricData, Lifetime, PingRateLimit, RecordedExperiment, Result, }; mod configuration; @@ -356,5 +356,31 @@ pub fn get_registered_ping_names() -> Vec { glean_core::glean_get_registered_ping_names() } +/// Updates attribution fields with new values. +/// AttributionMetrics fields with `None` values will not overwrite older values. +pub fn update_attribution(attribution: AttributionMetrics) { + glean_core::glean_update_attribution(attribution); +} + +/// **TEST-ONLY Method** +/// +/// Returns the current attribution metrics. +pub fn test_get_attribution() -> AttributionMetrics { + glean_core::glean_test_get_attribution() +} + +/// Updates distribution fields with new values. +/// DistributionMetrics fields with `None` values will not overwrite older values. +pub fn update_distribution(distribution: DistributionMetrics) { + glean_core::glean_update_distribution(distribution); +} + +/// **TEST-ONLY Method** +/// +/// Returns the current distribution metrics. +pub fn test_get_distribution() -> DistributionMetrics { + glean_core::glean_test_get_distribution() +} + #[cfg(test)] mod test; diff --git a/third_party/rust/glean/src/test.rs b/third_party/rust/glean/src/test.rs index d7e1c668c12..72e766d68a6 100644 --- a/third_party/rust/glean/src/test.rs +++ b/third_party/rust/glean/src/test.rs @@ -1501,3 +1501,49 @@ fn pings_ride_along_builtin_pings() { let url = r.recv().unwrap(); assert!(url.contains("ride-along")); } + +#[test] +fn test_attribution_and_distribution_updates_before_glean_inits() { + let _lock = lock_test(); + let dir = tempfile::tempdir().unwrap(); + let tmpname = dir.path().to_path_buf(); + + destroy_glean(true, &tmpname); + + // No Glean, let's set and update some attribution + distribution. + let mut attribution = AttributionMetrics { + source: Some("source".into()), + medium: Some("medium".into()), + campaign: Some("campaign".into()), + term: Some("term".into()), + content: Some("content".into()), + }; + let distribution = DistributionMetrics { + name: Some("name".into()), + }; + update_attribution(attribution.clone()); + update_distribution(distribution); + + let attribution_update = AttributionMetrics { + term: Some("new term".into()), + ..Default::default() + }; + let distribution_update = DistributionMetrics { + name: Some("different name".into()), + }; + update_attribution(attribution_update); + update_distribution(distribution_update.clone()); + + test_reset_glean( + ConfigurationBuilder::new(true, tmpname, GLOBAL_APPLICATION_ID) + .with_server_endpoint("invalid-test-host") + .build(), + ClientInfoMetrics::unknown(), + false, + ); + + // Ensure the updated attribution + distribution are correctly stored. + attribution.term = Some("new term".into()); + assert_eq!(attribution, test_get_attribution()); + assert_eq!(distribution_update, test_get_distribution()); +} diff --git a/third_party/rust/itertools/.cargo-checksum.json b/third_party/rust/itertools/.cargo-checksum.json index a4f2873c5c2..13a46812888 100644 --- a/third_party/rust/itertools/.cargo-checksum.json +++ b/third_party/rust/itertools/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"ed6c781d541c40d4a19eaecd794cadebb94b3f4d51e32367803542c88f0457ee","Cargo.toml":"6dcbab25126c0cdf64f5089156de0d4346914c6d47c557d370b8e20e039ca7d3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"3acfeb07424200ae70bf571ef63a96bae954c298bddf447c9bea0ea9394825cc","benches/bench1.rs":"bb06f39db0544b1380cd4929139ccf521a9eecab7ca3f910b9499f965ec0a047","benches/combinations.rs":"51523ee1ca438a56f14711f0b04ee943895062d35859fbe23a2714d2fca3289d","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/extra/mod.rs":"6ca290d72302a1945078621610b5788060b0de29639decebbdc557a80044aa97","benches/extra/zipslices.rs":"40e9f68a7c00f8429193fca463caef18851fa49b33355cc136bad3ccc840d655","benches/fold_specialization.rs":"5a517bbe29d366a15f6f751660e17ab1aa3e7b21552a1983048c662e34f0d69e","benches/powerset.rs":"6fd9d69a3483b37dc2411f99fb4efa6131577696f2dbdc8d1de9e4d7642fe3a3","benches/tree_fold1.rs":"539232e74f9aaea295a42069ac5af707811e90dc1c71c6e0a9064ffc731999de","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5a620783ae203e9ff9623d10d2c7fe9911d8b6c811cbad7613afa30e390c759d","clippy.toml":"33ffb83bbddb772575b3aa565b7136a8158ee386c216ffc2588fed9e83fa3826","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"1b465ed6a417180913104bc95a545fd9d1a3d67d121871ab737ad87e31b8be37","src/adaptors/coalesce.rs":"a0073325d40f297d29101538d18a267aef81889a999338dc09cb43a31cb4ec8b","src/adaptors/map.rs":"241971e856e468d71323071fb4a09867fbcedb83877320be132dc03516fe60e8","src/adaptors/mod.rs":"7f3bd7d011a348ce5e4bea486ef2e6346b64c7fe27540334d56d3f147f981d59","src/adaptors/multi_product.rs":"bb43e6dce68c815c21006d5b01c56e038d54b0c3bb8ee6bb8a4de11e2952c7ad","src/combinations.rs":"fb25babb459389093f886721016c72bf9f00e51d02735f638d871bb3a447ffd0","src/combinations_with_replacement.rs":"463011a574facbdd84278386b533a90e4dd517f0417e05adb82d182049db1f50","src/concat_impl.rs":"03b1ed61cbed242c286c3c4c5c848dbd57e02ab83fcef264f3a592b58107f324","src/cons_tuples_impl.rs":"c253d03b861831c01d62cacc57b49715ee62f6171e69f6886bb5a6ca0863bc3a","src/diff.rs":"a7800e9ce7a87b53ebe2338481335751fb43d44fa6a1ca719aceaaab40e5c8fe","src/duplicates_impl.rs":"f62fe4b642f501f785721ce5a505cf622a771e457210726dd0fb8b30be7ebbbc","src/either_or_both.rs":"76b13fbfac6bc959b4c1d8b7c99ce51726e95f994ca5429477e523a3d3950e4a","src/exactly_one_err.rs":"aa50081f6a31b5109b30e3ed305e3ec2413c6908dedc8990ec5378a99cee2b39","src/extrema_set.rs":"2a25b0b86eed2fd5d05622d591a3085cab823973d450816c2c3b8cb76e9c187e","src/flatten_ok.rs":"fe209fd886ecd9cb98d99625aa0c7274af7e644eff4a10de15b4dec8bbbc934a","src/format.rs":"a8192d85c0f9de8e633c202456e3cde0f3bc50f19b6bd8a4b2cfa3ef5123de1a","src/free.rs":"dfc57b7f56a08d4986a96b679018b41346576a7a34b668e008cc01109e728750","src/group_map.rs":"f7b02c964f63505d3e36280cfdc1755e05287714201efe983dacf702eee61434","src/groupbylazy.rs":"4f2181c022a45ff8444597708861fc6863eceb6f7555ea81cf3eeba19b492971","src/grouping_map.rs":"cbc45ac563345c96f3ac50c78f73c83d870523436a7ab88c1c9a685d204461d3","src/impl_macros.rs":"4f829b458873bed556f1aff2ae4e88dbd576766e2b5bcc07ff3ac8756758e6f4","src/intersperse.rs":"b9717242495846a4a979c95d93d5681caccb7c07a0d889eab763ad3d49a46125","src/k_smallest.rs":"603eb34314c01769ff7f6def2a24cf7a7b38507e6f3658b7aafc23a3b2e9b322","src/kmerge_impl.rs":"a347b0f6fa7715afd8a54d85ce139ed5b14c9e58a16c2b3648f5b288fdb5375f","src/lazy_buffer.rs":"834f6ef7fdf9f00c8a6329beb38eaefb706847ceeec309c221dce705c2c1e05b","src/lib.rs":"fadb0045279aafe8e8cccb45fadc383c7b358197b83c9c38fba87ada4cb2f84a","src/merge_join.rs":"1016113f6c983a9498bae5dc0570190437e1357b3333f6e19ea95c88599a1225","src/minmax.rs":"96d3897c28c8c63284d4729becc9ada6855e0953cac6e1bd35cf6f38c50b0ec0","src/multipeek_impl.rs":"35162bca4456bfa20a08e8d40e4d1cc6783dc662778789fdcded60371e975122","src/pad_tail.rs":"04be2ca73abb85815b06b5524c99d6feb2919180c486a4646f9cc6c87462f67b","src/peek_nth.rs":"6a0a51f2f373ce14d3d58595c46464878a14976bf00841a7396c03f9f9ab07ac","src/peeking_take_while.rs":"2b1b77c8882be32cfd76e973d303aa62f73370efd470c60764add0cdcca524d5","src/permutations.rs":"97831e7e26904c3cae68c97e74f7c6981ceb2fb2f2217282a0e5e54083a565fc","src/powerset.rs":"e0ee6b1316b4dd314c1e81502b90ae8113e1cda12168322520c5a65410e584b2","src/process_results_impl.rs":"9ed7fa46c8316238272ef47577387a386c1a109b50377dd3caf4291b6587cb73","src/put_back_n_impl.rs":"821e047fecd6ca0036290029f4febe7638a3abf1faa05e1e747a3bf9d80ff464","src/rciter_impl.rs":"5b156082ef2d25a94a4ad01d94cba2813c4b3e72e212515a8ad0fc8588f8045d","src/repeatn.rs":"bfc8f9145c9d8a3ea651f012b7d5a8d2fbbcbefdee76eafd098d02e7c54cda90","src/size_hint.rs":"021e57aad7df8f1e70ef588e9e9b8a1695aab183b1098f1848561f96c5dc9bcb","src/sources.rs":"61637f32c2cea2290ecfc1980c0b2d0f68463839ac09bd81006f8258ab8ecaae","src/tee.rs":"665832aa547389a420c3441470ff2494249f0ed2841be0c6a578367fe9dbd381","src/tuple_impl.rs":"00a9b61942425fb477b9691c3348646c0f9f534ff94f6321027f38c61ce2478c","src/unique_impl.rs":"3b89cdd668b74cc0a0eabb1522489e2305a0d2d8da25d6a1884e8626bbdb5959","src/unziptuple.rs":"84b50e5d29b9ddbf21a46a1cc2fd7877729c7f7da9bdc8ae1966dbaf2d2f6f60","src/with_position.rs":"c8a9b3476b3b90986b004a8877c19ff54b4c6800c5ac7ca1458d914036dacfe9","src/zip_eq_impl.rs":"4a41dc6dfe99359585d50ce648bdc85f15276c602048872b1d152e90841d8cad","src/zip_longest.rs":"f7cf5fffc3ca053ee80b410a05b27de1a475021f6de3181aea981010d7e8453f","src/ziptuple.rs":"7f9df12bf6556f382bbd4ad8cf17eb8b60c1c47fadbce016141133ba0f3384a1","tests/adaptors_no_collect.rs":"f459f36d54f5d475b2b2e83f5a1c98109c15062756ae822fa379486f3eeed666","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/macros_hygiene.rs":"522afa0106e3f11a5149e9218f89c2329e405546d2ef0ea756d6a27e8a0e9ca3","tests/merge_join.rs":"b08c4ee6529d234c68d411a413b8781455d18a1eab17872d1828bb75a4fcf79b","tests/peeking_take_while.rs":"4b1c394e44a9ef9bc0de707ae080b45803db722f79834c20f15b826d7c3f1f2e","tests/quick.rs":"6fcc0649b9270f024b169b1f499dd4cc7fecb0c9aec0dfc155b264916cc626e7","tests/specializations.rs":"fdd16dc663330033fedcc478609b393d4aa369dc07dc8cda31a75219fb793087","tests/test_core.rs":"32576ba90aa8e5db985b6e6ffe30e3046bc6a11d392db8f6b4bdd2ba48d9b24d","tests/test_std.rs":"f28a78a1912c950e7c37be1e82867e70dc585d60afecdebc7a97965194eee8e6","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"99af365fe6054ef1c6089d3e604e34da8fea66e55861ae4be9e7336ec8de4b56"},"package":"b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"} \ No newline at end of file +{"files":{"CHANGELOG.md":"60ec9a1801e015e49f7fbb299b608ac730d5b1a3fb298e6cf7935c0695ddf7fe","CONTRIBUTING.md":"d5787d0fd4df15481e2e09a37234ac5dec22c007c890826991f633d890efa29e","Cargo.lock":"4422e732d4ce6f650afb53a1dcffb1e53c86dd066c3dcd66bc9620acd898b99e","Cargo.toml":"77735549383196a4156a2246dd1cd6742029b223679b3004531456d33562b0ce","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"7dba3f55ea54eff2606f8b9f005e369cf9885dd972cb481432fce00234ee7750","benches/bench1.rs":"d632c8b839d7b318d1cb7b81b9c62570c77dcdf0696b8ce3d52067c79c930f78","benches/combinations.rs":"5b3bd243336d6b6bdc111d66218f3f0a4ecdb10fb72e90db79959e3d8bb2cf6f","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/fold_specialization.rs":"66ab13fd8576a662afb59ef72c5565f5c3d27f7f30a976450ee5a14958654fa2","benches/k_smallest.rs":"c1bb2aa597def7f7c282d1196f9d70be6d10e1acbae03279c05bc8065544bb8e","benches/powerset.rs":"dc1fd729584147e5d8e4d19c6ca6f8706087d41c3c5beb7293d9ea43b4beab14","benches/specializations.rs":"daa989877d83ccd58e8de529184d50905b3d6fa60a9eeae917f38bd570d72fa4","benches/tree_reduce.rs":"fa4f22f042b76df89094ddf6e925ba42c4c3992f8195e719ed035f2e7cfa05bd","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5ab542aca40df4390de0ebf3819665df402d924a7dd6f4280e6ffc942bbd25c4","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"42c1b2fc148df52a050b013a57b577ad19911f1fe85b9525863df501979b5cd1","src/adaptors/coalesce.rs":"b57157c205ae077dd398740b61c7f49023aa80868abd8a071a6fe89ae6ecc9ad","src/adaptors/map.rs":"4952ee770cb54e98b2f649efd9c98f18951689358eb9b6bee10f139d056353ae","src/adaptors/mod.rs":"1e0cf7409c7291a923cf87f1c6d27cc57bd9f71ca52f7dd08a429aa994daa6ce","src/adaptors/multi_product.rs":"ad501e8ae4e5089b9d2f2be1f9a4713da6a2103b14daa759e09918409f88e321","src/combinations.rs":"9c4490bc4c7488fe9a8dba656a30493d90abb33006f7abbe3e266c237ffc986b","src/combinations_with_replacement.rs":"c7d6b7a122057e9aab075b2de41440ccd2973a6985fba75c2e93af13de55ef90","src/concat_impl.rs":"d61c00d43eca1193f135e25d3b6afd840c02ef1c573c29b264c47ee3429a45e8","src/cons_tuples_impl.rs":"7f46da33168107860b2b15d05d8edfe618e41bbc66ff0e16baf82d7373c4356d","src/diff.rs":"6e5ba3705a3a076d4fc360594014c90f1dfc597e61e8a629f96efa050e2433f5","src/duplicates_impl.rs":"1be37249b4566edc8da611ed9766ec851a526e7513bd13d80fe97482dcfcf7f3","src/either_or_both.rs":"cac278666b5d3c1fd103d97d15ce4c40960ea459441aeae83c6502087fd2ad8d","src/exactly_one_err.rs":"90b6204551161d27394af72107765dbfe3b51a77f4770c2e506fa4938985a184","src/extrema_set.rs":"11de200d853941716e9aa9a9b520b006704827c3c43a0c5f067906b0941e51d1","src/flatten_ok.rs":"62c18e5221a27949a00de49414306d6dfd601515817c1c8ae6189e3275756dd3","src/format.rs":"3ae6414043e0040f7358028c560437ea49afdbb2416df138a2410169e2619589","src/free.rs":"00ec21acee2ae2b30bf99e62472f9684c0a1719fbafc8dd2e4195ea8377c5b5d","src/group_map.rs":"c9da201137c6bb479b9308bfc38398b76950e39905f4ce8bc435c5318371522c","src/groupbylazy.rs":"5862629719258703aad47977ba1060f20fff15e962e18e6142758ebf6cd4a61c","src/grouping_map.rs":"3896c46ba4bd8ea886e5344a245658235626a104758d5ccecf223544a9ba471b","src/impl_macros.rs":"97fc5f39574805e0c220aa462cf1ae7dcac5c1082d6ee5500e7d71c120db5f88","src/intersperse.rs":"55031819e985c3184275e254c9600ecbe01e9fb49f198039c5da82a87ea5b90e","src/iter_index.rs":"1b0ff8376a4ad855d44db8c662450c777db84e0f4997b53ca575c65b107bb83b","src/k_smallest.rs":"a6840980e4c1aedd6987f93c904d362aa09a101537e447121fff58bb2473638d","src/kmerge_impl.rs":"3f999d55d7def904f71f2ca88b36707461f7f23b32966e0ccaf31d808886d843","src/lazy_buffer.rs":"baa01490fceb5a8dd7bd9c2634e19ce8a785bd1df352a9dd77d1344e3e0f8892","src/lib.rs":"e7f144351cca5018dc12270b4c33f0562afddb92452acfa85153cb276aebd6e9","src/merge_join.rs":"f2f257e63c84ed772b235229cc787ebe9ae009d7c80ed2087002a6b62c5e2133","src/minmax.rs":"0ec34b172ca8efc4aacb96f3e5771bdc5e8ac882876ee0f59d698c3924717c48","src/multipeek_impl.rs":"79eef0be49ad66f15d41808e72c03976c4f7cff5838b69d17975d3ece266f3f8","src/next_array.rs":"295924058891c08f9fe6313a1d9dd0042dcf60f0a514c6a6e009a1396d804fc9","src/pad_tail.rs":"e6bb5b086478600b0dbb8726cae8364bf83ab36d989ef467e1264eea43933b50","src/peek_nth.rs":"093f1a157b1c917f041af5244a5a46311affa2922126e36dc0ee2c501c79b58c","src/peeking_take_while.rs":"075ce13475c84e2cfdfaf1a7a0d0695332102c82a61914ed4c00a7d2634b1d34","src/permutations.rs":"b316084ee14e9e138d22f177367b3bfa24cb3e5e90ab20b9b00a9a23d653496f","src/powerset.rs":"7ab24fefc914b339dd92a6c8e639d0cad34479e09293b3346078856d6bc02d34","src/process_results_impl.rs":"6b5d82447eef4e87fef7b2a8e56b906ac7b000886a468ce421252f34ec86e371","src/put_back_n_impl.rs":"5a58d7a31c03029f0726e4d42de3be869580cf76b73c6d1ef70dd40c240b03a0","src/rciter_impl.rs":"081fd206ba4a601bd65e2f3b8d7c95e3e4a3564beb7c98944bd2e7986959c230","src/repeatn.rs":"dd9a5bf5a63ef9cc6ec5c8a6137c7ffba80f13568b6d001e189daaa29ffbaf39","src/size_hint.rs":"6022c2327ddc6df7e7b939eb60a93ee66ea9aa4d3aab49b9952e663ff4bff10b","src/sources.rs":"ef942af209ca1effcd28a95abedad8c45b659ae2a15b66c2158cb604f6e325f8","src/take_while_inclusive.rs":"1973a9f5322b3dae3b5ccded5912a08a8e2e975b9a5eac666192b118b230d305","src/tee.rs":"dad50ca162627cf0a67786f0993ef27d06cdefc14d412463e58c07824ef409d8","src/tuple_impl.rs":"0213261109e7c65746ccc22425d19141907bf7ea1e3dd4c40e9f278e6148e272","src/unique_impl.rs":"1efc280226f13ddd7dd5f7eedeec0093b704596652c942f3a0b2f8c90fa2e2f7","src/unziptuple.rs":"f3f6a2ee2658fa07db7592f2c344c2e3b1263a21fc75e1325f2be32c9dc1e750","src/with_position.rs":"9ca1eb195d04690b0c3a62a6c0eea349b8042e11c4ca4b80744f54103e1c7355","src/zip_eq_impl.rs":"3282b177e7dece5d3fbdc9b03563f209589a399ea45e70abf23ccca3b5512ac7","src/zip_longest.rs":"5572699564dd5717cc074b7733333ed238c2e9f3e6819d45e33e3a2dbda74478","src/ziptuple.rs":"d3a12221d39c8a5514574adb3ad2ccd1803d514b1cb09fbcd9253e3ddd628310","tests/adaptors_no_collect.rs":"7e6240878b1fc13b6384fdde0317d5d7ccca3e417b10a201ba61eb5255400fda","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/laziness.rs":"89e6caec10da3d7aeadf9e30d5caf03cda36d07cee8415ff134b5b8e2a2cf144","tests/macros_hygiene.rs":"c2d517badf593c0ba9b70e987a6f8482ed8997547b2e88bbec70babd9b677aa2","tests/merge_join.rs":"5fb506b989f4a331d46cdec5775ea594656985134196099eaf8d3905bdddcdd5","tests/peeking_take_while.rs":"f834361c5520dda15eb9e9ebe87507c905462201412b21859d9f83dab91d0e0b","tests/quick.rs":"d463bf8712b32742c93bc2cf3993031aeaba1f5b0505ca0ecd347313c3da0582","tests/specializations.rs":"fefbdac83bb774186882e3d31be619c9ce1dbfc4191a99ed2ac90aa764737a8f","tests/test_core.rs":"9bbc6772e97a60d93d4021c184b9e4de1c0440a1c48b991a92edc189699fd20d","tests/test_std.rs":"b0e56deefe309b9c11804bd069c744b5caea7960cd4b68244531f6edf38b9741","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"457e34761d9bf2943a43abd9020d2b1a4492ebff9e4d94efe4c730652fbf62af"},"package":"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"} \ No newline at end of file diff --git a/third_party/rust/itertools/CHANGELOG.md b/third_party/rust/itertools/CHANGELOG.md index d2b40b5dbd1..6b08f68309a 100644 --- a/third_party/rust/itertools/CHANGELOG.md +++ b/third_party/rust/itertools/CHANGELOG.md @@ -1,5 +1,192 @@ # Changelog +## 0.14.0 + +### Breaking +- Increased MSRV to 1.63.0 (#960) +- Removed generic parameter from `cons_tuples` (#988) + +### Added +- Added `array_combinations` (#991) +- Added `k_smallest_relaxed` and variants (#925) +- Added `next_array` and `collect_array` (#560) +- Implemented `DoubleEndedIterator` for `FilterOk` (#948) +- Implemented `DoubleEndedIterator` for `FilterMapOk` (#950) + +### Changed +- Allow `Q: ?Sized` in `Itertools::contains` (#971) +- Improved hygiene of `chain!` (#943) +- Improved `into_group_map_by` documentation (#1000) +- Improved `tree_reduce` documentation (#955) +- Improved discoverability of `merge_join_by` (#966) +- Improved discoverability of `take_while_inclusive` (#972) +- Improved documentation of `find_or_last` and `find_or_first` (#984) +- Prevented exponentially large type sizes in `tuple_combinations` (#945) +- Added `track_caller` attr for `asser_equal` (#976) + +### Notable Internal Changes +- Fixed clippy lints (#956, #987, #1008) +- Addressed warnings within doctests (#964) +- CI: Run most tests with miri (#961) +- CI: Speed up "cargo-semver-checks" action (#938) +- Changed an instance of `default_features` in `Cargo.toml` to `default-features` (#985) + +## 0.13.0 + +### Breaking +- Removed implementation of `DoubleEndedIterator` for `ConsTuples` (#853) +- Made `MultiProduct` fused and fixed on an empty iterator (#835, #834) +- Changed `iproduct!` to return tuples for maxi one iterator too (#870) +- Changed `PutBack::put_back` to return the old value (#880) +- Removed deprecated `repeat_call, Itertools::{foreach, step, map_results, fold_results}` (#878) +- Removed `TakeWhileInclusive::new` (#912) + +### Added +- Added `Itertools::{smallest_by, smallest_by_key, largest, largest_by, largest_by_key}` (#654, #885) +- Added `Itertools::tail` (#899) +- Implemented `DoubleEndedIterator` for `ProcessResults` (#910) +- Implemented `Debug` for `FormatWith` (#931) +- Added `Itertools::get` (#891) + +### Changed +- Deprecated `Itertools::group_by` (renamed `chunk_by`) (#866, #879) +- Deprecated `unfold` (use `std::iter::from_fn` instead) (#871) +- Optimized `GroupingMapBy` (#873, #876) +- Relaxed `Fn` bounds to `FnMut` in `diff_with, Itertools::into_group_map_by` (#886) +- Relaxed `Debug/Clone` bounds for `MapInto` (#889) +- Documented the `use_alloc` feature (#887) +- Optimized `Itertools::set_from` (#888) +- Removed badges in `README.md` (#890) +- Added "no-std" categories in `Cargo.toml` (#894) +- Fixed `Itertools::k_smallest` on short unfused iterators (#900) +- Deprecated `Itertools::tree_fold1` (renamed `tree_reduce`) (#895) +- Deprecated `GroupingMap::fold_first` (renamed `reduce`) (#902) +- Fixed `Itertools::k_smallest(0)` to consume the iterator, optimized `Itertools::k_smallest(1)` (#909) +- Specialized `Combinations::nth` (#914) +- Specialized `MergeBy::fold` (#920) +- Specialized `CombinationsWithReplacement::nth` (#923) +- Specialized `FlattenOk::{fold, rfold}` (#927) +- Specialized `Powerset::nth` (#924) +- Documentation fixes (#882, #936) +- Fixed `assert_equal` for iterators longer than `i32::MAX` (#932) +- Updated the `must_use` message of non-lazy `KMergeBy` and `TupleCombinations` (#939) + +### Notable Internal Changes +- Tested iterator laziness (#792) +- Created `CONTRIBUTING.md` (#767) + +## 0.12.1 + +### Added +- Documented iteration order guarantee for `Itertools::[tuple_]combinations` (#822) +- Documented possible panic in `iterate` (#842) +- Implemented `Clone` and `Debug` for `Diff` (#845) +- Implemented `Debug` for `WithPosition` (#859) +- Implemented `Eq` for `MinMaxResult` (#838) +- Implemented `From>` for `Option>` (#843) +- Implemented `PeekingNext` for `RepeatN` (#855) + +### Changed +- Made `CoalesceBy` lazy (#801) +- Optimized `Filter[Map]Ok::next`, `Itertools::partition`, `Unique[By]::next[_back]` (#818) +- Optimized `Itertools::find_position` (#837) +- Optimized `Positions::next[_back]` (#816) +- Optimized `ZipLongest::fold` (#854) +- Relaxed `Debug` bounds for `GroupingMapBy` (#860) +- Specialized `ExactlyOneError::fold` (#826) +- Specialized `Interleave[Shortest]::fold` (#849) +- Specialized `MultiPeek::fold` (#820) +- Specialized `PadUsing::[r]fold` (#825) +- Specialized `PeekNth::fold` (#824) +- Specialized `Positions::[r]fold` (#813) +- Specialized `PutBackN::fold` (#823) +- Specialized `RepeatN::[r]fold` (#821) +- Specialized `TakeWhileInclusive::fold` (#851) +- Specialized `ZipLongest::rfold` (#848) + +### Notable Internal Changes +- Added test coverage in CI (#847, #856) +- Added semver check in CI (#784) +- Enforced `clippy` in CI (#740) +- Enforced `rustdoc` in CI (#840) +- Improved specialization tests (#807) +- More specialization benchmarks (#806) + +## 0.12.0 + +### Breaking +- Made `take_while_inclusive` consume iterator by value (#709) +- Added `Clone` bound to `Unique` (#777) + +### Added +- Added `Itertools::try_len` (#723) +- Added free function `sort_unstable` (#796) +- Added `GroupMap::fold_with` (#778, #785) +- Added `PeekNth::{peek_mut, peek_nth_mut}` (#716) +- Added `PeekNth::{next_if, next_if_eq}` (#734) +- Added conversion into `(Option,Option)` to `EitherOrBoth` (#713) +- Added conversion from `Either` to `EitherOrBoth` (#715) +- Implemented `ExactSizeIterator` for `Tuples` (#761) +- Implemented `ExactSizeIterator` for `(Circular)TupleWindows` (#752) +- Made `EitherOrBoth` a shorthand for `EitherOrBoth` (#719) + +### Changed +- Added missing `#[must_use]` annotations on iterator adaptors (#794) +- Made `Combinations` lazy (#795) +- Made `Intersperse(With)` lazy (#797) +- Made `Permutations` lazy (#793) +- Made `Product` lazy (#800) +- Made `TupleWindows` lazy (#602) +- Specialized `Combinations::{count, size_hint}` (#729) +- Specialized `CombinationsWithReplacement::{count, size_hint}` (#737) +- Specialized `Powerset::fold` (#765) +- Specialized `Powerset::count` (#735) +- Specialized `TupleCombinations::{count, size_hint}` (#763) +- Specialized `TupleCombinations::fold` (#775) +- Specialized `WhileSome::fold` (#780) +- Specialized `WithPosition::fold` (#772) +- Specialized `ZipLongest::fold` (#774) +- Changed `{min, max}_set*` operations require `alloc` feature, instead of `std` (#760) +- Improved documentation of `tree_fold1` (#787) +- Improved documentation of `permutations` (#724) +- Fixed typo in documentation of `multiunzip` (#770) + +### Notable Internal Changes +- Improved specialization tests (#799, #786, #782) +- Simplified implementation of `Permutations` (#739, #748, #790) +- Combined `Merge`/`MergeBy`/`MergeJoinBy` implementations (#736) +- Simplified `Permutations::size_hint` (#739) +- Fix wrapping arithmetic in benchmarks (#770) +- Enforced `rustfmt` in CI (#751) +- Disallowed compile warnings in CI (#720) +- Used `cargo hack` to check MSRV (#754) + +## 0.11.0 + +### Breaking +- Make `Itertools::merge_join_by` also accept functions returning bool (#704) +- Implement `PeekingNext` transitively over mutable references (#643) +- Change `with_position` to yield `(Position, Item)` instead of `Position` (#699) + +### Added +- Add `Itertools::take_while_inclusive` (#616) +- Implement `PeekingNext` for `PeekingTakeWhile` (#644) +- Add `EitherOrBoth::{just_left, just_right, into_left, into_right, as_deref, as_deref_mut, left_or_insert, right_or_insert, left_or_insert_with, right_or_insert_with, insert_left, insert_right, insert_both}` (#629) +- Implement `Clone` for `CircularTupleWindows` (#686) +- Implement `Clone` for `Chunks` (#683) +- Add `Itertools::process_results` (#680) + +### Changed +- Use `Cell` instead of `RefCell` in `Format` and `FormatWith` (#608) +- CI tweaks (#674, #675) +- Document and test the difference between stable and unstable sorts (#653) +- Fix documentation error on `Itertools::max_set_by_key` (#692) +- Move MSRV metadata to `Cargo.toml` (#672) +- Implement `equal` with `Iterator::eq` (#591) + +## 0.10.5 + - Maintenance + ## 0.10.4 - Add `EitherOrBoth::or` and `EitherOrBoth::or_else` (#593) - Add `min_set`, `max_set` et al. (#613, #323) @@ -7,6 +194,9 @@ - Documentation fixes (#612, #625, #632, #633, #634, #638) - Code maintenance (#623, #624, #627, #630) +## 0.10.3 + - Maintenance + ## 0.10.2 - Add `Itertools::multiunzip` (#362, #565) - Add `intersperse` and `intersperse_with` free functions (#555) diff --git a/third_party/rust/itertools/CONTRIBUTING.md b/third_party/rust/itertools/CONTRIBUTING.md new file mode 100644 index 00000000000..1dbf6f59dd5 --- /dev/null +++ b/third_party/rust/itertools/CONTRIBUTING.md @@ -0,0 +1,189 @@ +# Contributing to itertools + +We use stable Rust only. +Please check the minimum version of Rust we use in `Cargo.toml`. + +_If you are proposing a major change to CI or a new iterator adaptor for this crate, +then **please first file an issue** describing your proposal._ +[Usual concerns about new methods](https://github.com/rust-itertools/itertools/issues/413#issuecomment-657670781). + +To pass CI tests successfully, your code must be free of "compiler warnings" and "clippy warnings" and be "rustfmt" formatted. + +Note that small PRs are easier to review and therefore are more easily merged. + +## Write a new method/adaptor for `Itertools` trait +In general, the code logic should be tested with [quickcheck](https://crates.io/crates/quickcheck) tests in `tests/quick.rs` +which allow us to test properties about the code with randomly generated inputs. + +### Behind `use_std`/`use_alloc` feature? +If it needs the "std" (such as using hashes) then it should be behind the `use_std` feature, +or if it requires heap allocation (such as using vectors) then it should be behind the `use_alloc` feature. +Otherwise it should be able to run in `no_std` context. + +This mostly applies to your new module, each import from it, and to your new `Itertools` method. + +### Pick the right receiver +`self`, `&mut self` or `&self`? From [#710](https://github.com/rust-itertools/itertools/pull/710): + +- Take by value when: + - It transfers ownership to another iterator type, such as `filter`, `map`... + - It consumes the iterator completely, such as `count`, `last`, `max`... +- Mutably borrow when it consumes only part of the iterator, such as `find`, `all`, `try_collect`... +- Immutably borrow when there is no change, such as `size_hint`. + +### Laziness +Iterators are [lazy](https://doc.rust-lang.org/std/iter/index.html#laziness): + +- structs of iterator adaptors should have `#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]` ; +- structs of iterators should have `#[must_use = "iterators are lazy and do nothing unless consumed"]`. + +Those behaviors are **tested** in `tests/laziness.rs`. + +## Specialize `Iterator` methods +It might be more performant to specialize some methods. +However, each specialization should be thoroughly tested. + +Correctly specializing methods can be difficult, and _we do not require that you do it on your initial PR_. + +Most of the time, we want specializations of: + +- [`size_hint`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.size_hint): + It mostly allows allocation optimizations. + When always exact, it also enables to implement `ExactSizeIterator`. + See our private module `src/size_hint.rs` for helpers. +- [`fold`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.fold) + might make iteration faster than calling `next` repeatedly. +- [`count`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.count), + [`last`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.last), + [`nth`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.nth) + as we might be able to avoid iterating on every item with `next`. + +Additionally, + +- `for_each`, `reduce`, `max/min[_by[_key]]` and `partition` all rely on `fold` so you should specialize it instead. +- `all`, `any`, `find`, `find_map`, `cmp`, `partial_cmp`, `eq`, `ne`, `lt`, `le`, `gt`, `ge` and `position` all rely (by default) on `try_fold` + which we can not specialize on stable rust, so you might want to wait it stabilizes + or specialize each of them. +- `DoubleEndedIterator::{nth_back, rfold, rfind}`: similar reasoning. + +An adaptor might use the inner iterator specializations for its own specializations. + +They are **tested** in `tests/specializations.rs` and **benchmarked** in `benches/specializations.rs` +(build those benchmarks is slow so you might want to temporarily remove the ones you do not want to measure). + +## Additional implementations +### The [`Debug`](https://doc.rust-lang.org/std/fmt/trait.Debug.html) implementation +All our iterators should implement `Debug`. + +When one of the field is not debuggable (such as _functions_), you must not derive `Debug`. +Instead, manually implement it and _ignore this field_ in our helper macro `debug_fmt_fields`. + +
    +4 examples (click to expand) + +```rust +use std::fmt; + +/* ===== Simple derive. ===== */ +#[derive(Debug)] +struct Name1 { + iter: I, +} + +/* ===== With an unclonable field. ===== */ +struct Name2 { + iter: I, + func: F, +} + +// No `F: Debug` bound and the field `func` is ignored. +impl fmt::Debug for Name2 { + // it defines the `fmt` function from a struct name and the fields you want to debug. + debug_fmt_fields!(Name2, iter); +} + +/* ===== With an unclonable field, but another bound to add. ===== */ +struct Name3 { + iter: I, + item: Option, + func: F, +} + +// Same about `F` and `func`, similar about `I` but we must add the `I::Item: Debug` bound. +impl fmt::Debug for Name3 +where + I::Item: fmt::Debug, +{ + debug_fmt_fields!(Name3, iter, item); +} + +/* ===== With an unclonable field for which we can provide some information. ===== */ +struct Name4 { + iter: I, + func: Option, +} + +// If ignore a field is not good enough, implement Debug fully manually. +impl fmt::Debug for Name4 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let func = if self.func.is_some() { "Some(_)" } else { "None" }; + f.debug_struct("Name4") + .field("iter", &self.iter) + .field("func", &func) + .finish() + } +} +``` +
    + +### When/How to implement [`Clone`](https://doc.rust-lang.org/std/clone/trait.Clone.html) +All our iterators should implement `Clone` when possible. + +Note that a mutable reference is never clonable so `struct Name<'a, I: 'a> { iter: &'a mut I }` can not implement `Clone`. + +Derive `Clone` on a generic struct adds the bound `Clone` on each generic parameter. +It might be an issue in which case you should manually implement it with our helper macro `clone_fields` (it defines the `clone` function calling `clone` on each field) and be careful about the bounds. + +### When to implement [`std::iter::FusedIterator`](https://doc.rust-lang.org/std/iter/trait.FusedIterator.html) +This trait should be implemented _by all iterators that always return `None` after returning `None` once_, because it allows to optimize `Iterator::fuse()`. + +The conditions on which it should be implemented are usually the ones from the `Iterator` implementation, eventually refined to ensure it behaves in a fused way. + +### When to implement [`ExactSizeIterator`](https://doc.rust-lang.org/std/iter/trait.ExactSizeIterator.html) +_When we are always able to return an exact non-overflowing length._ + +Therefore, we do not implement it on adaptors that makes the iterator longer as the resulting length could overflow. + +One should not override `ExactSizeIterator::len` method but rely on an exact `Iterator::size_hint` implementation, meaning it returns `(length, Some(length))` (unless you could make `len` more performant than the default). + +The conditions on which it should be implemented are usually the ones from the `Iterator` implementation, probably refined to ensure the size hint is exact. + +### When to implement [`DoubleEndedIterator`](https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html) +When the iterator structure allows to handle _iterating on both fronts simultaneously_. +The iteration might stop in the middle when both fronts meet. + +The conditions on which it should be implemented are usually the ones from the `Iterator` implementation, probably refined to ensure we can iterate on both fronts simultaneously. + +### When to implement [`itertools::PeekingNext`](https://docs.rs/itertools/latest/itertools/trait.PeekingNext.html) +TODO + +This is currently **tested** in `tests/test_std.rs`. + +## About lending iterators +TODO + + +## Other notes +No guideline about using `#[inline]` yet. + +### `.fold` / `.for_each` / `.try_fold` / `.try_for_each` +In the Rust standard library, it's quite common for `fold` to be implemented in terms of `try_fold`. But it's not something we do yet because we can not specialize `try_fold` methods yet (it uses the unstable `Try`). + +From [#781](https://github.com/rust-itertools/itertools/pull/781), the general rule to follow is something like this: + +- If you need to completely consume an iterator: + - Use `fold` if you need an _owned_ access to an accumulator. + - Use `for_each` otherwise. +- If you need to partly consume an iterator, the same applies with `try_` versions: + - Use `try_fold` if you need an _owned_ access to an accumulator. + - Use `try_for_each` otherwise. diff --git a/third_party/rust/itertools/Cargo.lock b/third_party/rust/itertools/Cargo.lock new file mode 100644 index 00000000000..fbf369b2fab --- /dev/null +++ b/third_party/rust/itertools/Cargo.lock @@ -0,0 +1,740 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags", + "clap_lex", + "indexmap", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "atty", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools 0.10.5", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +dependencies = [ + "criterion", + "either", + "paste", + "permutohedron", + "quickcheck", + "rand", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "permutohedron" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b687ff7b5da449d39e418ad391e5e08da53ec334903ddbb921db208908fc372c" + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quickcheck" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f" +dependencies = [ + "rand", + "rand_core", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.202" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.202" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/third_party/rust/itertools/Cargo.toml b/third_party/rust/itertools/Cargo.toml index 40be7e48f0e..96f9597712b 100644 --- a/third_party/rust/itertools/Cargo.toml +++ b/third_party/rust/itertools/Cargo.toml @@ -3,71 +3,165 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies +# to registry (e.g., crates.io) dependencies. # -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. [package] edition = "2018" +rust-version = "1.63.0" name = "itertools" -version = "0.10.5" +version = "0.14.0" authors = ["bluss"] -exclude = ["/bors.toml"] +build = false +autolib = false +autobins = false +autoexamples = false +autotests = false +autobenches = false description = "Extra iterator adaptors, iterator methods, free functions, and macros." documentation = "https://docs.rs/itertools/" readme = "README.md" -keywords = ["iterator", "data-structure", "zip", "product", "group-by"] -categories = ["algorithms", "rust-patterns"] -license = "MIT/Apache-2.0" +keywords = [ + "iterator", + "data-structure", + "zip", + "product", +] +categories = [ + "algorithms", + "rust-patterns", + "no-std", + "no-std::no-alloc", +] +license = "MIT OR Apache-2.0" repository = "https://github.com/rust-itertools/itertools" -[package.metadata.release] -no-dev-version = true -[profile.bench] -debug = true + +[features] +default = ["use_std"] +use_alloc = [] +use_std = [ + "use_alloc", + "either/use_std", +] [lib] +name = "itertools" +path = "src/lib.rs" test = false bench = false -[[bench]] -name = "tuple_combinations" -harness = false +[[example]] +name = "iris" +path = "examples/iris.rs" -[[bench]] +[[test]] +name = "adaptors_no_collect" +path = "tests/adaptors_no_collect.rs" + +[[test]] +name = "flatten_ok" +path = "tests/flatten_ok.rs" + +[[test]] +name = "laziness" +path = "tests/laziness.rs" + +[[test]] +name = "macros_hygiene" +path = "tests/macros_hygiene.rs" + +[[test]] +name = "merge_join" +path = "tests/merge_join.rs" + +[[test]] +name = "peeking_take_while" +path = "tests/peeking_take_while.rs" + +[[test]] +name = "quick" +path = "tests/quick.rs" + +[[test]] +name = "specializations" +path = "tests/specializations.rs" + +[[test]] +name = "test_core" +path = "tests/test_core.rs" + +[[test]] +name = "test_std" +path = "tests/test_std.rs" + +[[test]] name = "tuples" -harness = false +path = "tests/tuples.rs" -[[bench]] -name = "fold_specialization" -harness = false - -[[bench]] -name = "combinations_with_replacement" -harness = false - -[[bench]] -name = "tree_fold1" -harness = false +[[test]] +name = "zip" +path = "tests/zip.rs" [[bench]] name = "bench1" +path = "benches/bench1.rs" harness = false [[bench]] name = "combinations" +path = "benches/combinations.rs" +harness = false + +[[bench]] +name = "combinations_with_replacement" +path = "benches/combinations_with_replacement.rs" +harness = false + +[[bench]] +name = "fold_specialization" +path = "benches/fold_specialization.rs" +harness = false + +[[bench]] +name = "k_smallest" +path = "benches/k_smallest.rs" harness = false [[bench]] name = "powerset" +path = "benches/powerset.rs" harness = false + +[[bench]] +name = "specializations" +path = "benches/specializations.rs" +harness = false + +[[bench]] +name = "tree_reduce" +path = "benches/tree_reduce.rs" +harness = false + +[[bench]] +name = "tuple_combinations" +path = "benches/tuple_combinations.rs" +harness = false + +[[bench]] +name = "tuples" +path = "benches/tuples.rs" +harness = false + [dependencies.either] version = "1.0" default-features = false + [dev-dependencies.criterion] -version = "=0" +version = "0.4.0" +features = ["html_reports"] [dev-dependencies.paste] version = "1.0.0" @@ -82,7 +176,5 @@ default-features = false [dev-dependencies.rand] version = "0.7" -[features] -default = ["use_std"] -use_alloc = [] -use_std = ["use_alloc", "either/use_std"] +[profile.bench] +debug = 2 diff --git a/third_party/rust/itertools/README.md b/third_party/rust/itertools/README.md index a911127f455..46acc3fcae0 100644 --- a/third_party/rust/itertools/README.md +++ b/third_party/rust/itertools/README.md @@ -4,14 +4,11 @@ Extra iterator adaptors, functions and macros. Please read the [API documentation here](https://docs.rs/itertools/). -[![build_status](https://github.com/rust-itertools/itertools/actions/workflows/ci.yml/badge.svg)](https://github.com/rust-itertools/itertools/actions) -[![crates.io](https://img.shields.io/crates/v/itertools.svg)](https://crates.io/crates/itertools) - How to use with Cargo: ```toml [dependencies] -itertools = "0.10.5" +itertools = "0.14.0" ``` How to use in your crate: @@ -21,17 +18,9 @@ use itertools::Itertools; ``` ## How to contribute +If you're not sure what to work on, try checking the [help wanted](https://github.com/rust-itertools/itertools/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) label. -- Fix a bug or implement a new thing -- Include tests for your new feature, preferably a QuickCheck test -- Make a Pull Request - -For new features, please first consider filing a PR to [rust-lang/rust](https://github.com/rust-lang/rust), -adding your new feature to the `Iterator` trait of the standard library, if you believe it is reasonable. -If it isn't accepted there, proposing it for inclusion in ``itertools`` is a good idea. -The reason for doing is this is so that we avoid future breakage as with ``.flatten()``. -However, if your feature involves heap allocation, such as storing elements in a ``Vec``, -then it can't be accepted into ``libcore``, and you should propose it for ``itertools`` directly instead. +See our [CONTRIBUTING.md](https://github.com/rust-itertools/itertools/blob/master/CONTRIBUTING.md) for a detailed guide. ## License diff --git a/third_party/rust/itertools/benches/bench1.rs b/third_party/rust/itertools/benches/bench1.rs index 71278d17b6b..53e77b0da46 100644 --- a/third_party/rust/itertools/benches/bench1.rs +++ b/third_party/rust/itertools/benches/bench1.rs @@ -1,22 +1,20 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use itertools::Itertools; +use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; use itertools::free::cloned; use itertools::iproduct; +use itertools::Itertools; -use std::iter::repeat; use std::cmp; +use std::iter::repeat; use std::ops::{Add, Range}; -mod extra; - -use crate::extra::ZipSlices; - fn slice_iter(c: &mut Criterion) { let xs: Vec<_> = repeat(1i32).take(20).collect(); c.bench_function("slice iter", move |b| { - b.iter(|| for elt in xs.iter() { - black_box(elt); + b.iter(|| { + for elt in xs.iter() { + black_box(elt); + } }) }); } @@ -25,8 +23,10 @@ fn slice_iter_rev(c: &mut Criterion) { let xs: Vec<_> = repeat(1i32).take(20).collect(); c.bench_function("slice iter rev", move |b| { - b.iter(|| for elt in xs.iter().rev() { - black_box(elt); + b.iter(|| { + for elt in xs.iter().rev() { + black_box(elt); + } }) }); } @@ -116,72 +116,6 @@ fn zip_slices_ziptuple(c: &mut Criterion) { }); } -fn zipslices(c: &mut Criterion) { - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - c.bench_function("zipslices", move |b| { - b.iter(|| { - for (&x, &y) in ZipSlices::new(&xs, &ys) { - black_box(x); - black_box(y); - } - }) - }); -} - -fn zipslices_mut(c: &mut Criterion) { - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let mut ys = black_box(ys); - - c.bench_function("zipslices mut", move |b| { - b.iter(|| { - for (&x, &mut y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) { - black_box(x); - black_box(y); - } - }) - }); -} - -fn zipdot_i32_zipslices(c: &mut Criterion) { - let xs = vec![2; 1024]; - let ys = vec![2; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - c.bench_function("zipdot i32 zipslices", move |b| { - b.iter(|| { - let mut s = 0i32; - for (&x, &y) in ZipSlices::new(&xs, &ys) { - s += x * y; - } - s - }) - }); -} - -fn zipdot_f32_zipslices(c: &mut Criterion) { - let xs = vec![2f32; 1024]; - let ys = vec![2f32; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - c.bench_function("zipdot f32 zipslices", move |b| { - b.iter(|| { - let mut s = 0.; - for (&x, &y) in ZipSlices::new(&xs, &ys) { - s += x * y; - } - s - }) - }); -} - fn zip_checked_counted_loop(c: &mut Criterion) { let xs = vec![0; 1024]; let ys = vec![0; 768]; @@ -307,10 +241,10 @@ fn zip_unchecked_counted_loop(c: &mut Criterion) { let len = cmp::min(xs.len(), ys.len()); for i in 0..len { unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - black_box(x); - black_box(y); + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + black_box(x); + black_box(y); } } }) @@ -329,9 +263,9 @@ fn zipdot_i32_unchecked_counted_loop(c: &mut Criterion) { let mut s = 0i32; for i in 0..len { unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - s += x * y; + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + s += x * y; } } s @@ -351,9 +285,9 @@ fn zipdot_f32_unchecked_counted_loop(c: &mut Criterion) { let mut s = 0f32; for i in 0..len { unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - s += x * y; + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + s += x * y; } } s @@ -374,19 +308,19 @@ fn zip_unchecked_counted_loop3(c: &mut Criterion) { let len = cmp::min(xs.len(), cmp::min(ys.len(), zs.len())); for i in 0..len { unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - let z = *zs.get_unchecked(i); - black_box(x); - black_box(y); - black_box(z); + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + let z = *zs.get_unchecked(i); + black_box(x); + black_box(y); + black_box(z); } } }) }); } -fn group_by_lazy_1(c: &mut Criterion) { +fn chunk_by_lazy_1(c: &mut Criterion) { let mut data = vec![0; 1024]; for (index, elt) in data.iter_mut().enumerate() { *elt = index / 10; @@ -394,10 +328,10 @@ fn group_by_lazy_1(c: &mut Criterion) { let data = black_box(data); - c.bench_function("group by lazy 1", move |b| { + c.bench_function("chunk by lazy 1", move |b| { b.iter(|| { - for (_key, group) in &data.iter().group_by(|elt| **elt) { - for elt in group { + for (_key, chunk) in &data.iter().chunk_by(|elt| **elt) { + for elt in chunk { black_box(elt); } } @@ -405,7 +339,7 @@ fn group_by_lazy_1(c: &mut Criterion) { }); } -fn group_by_lazy_2(c: &mut Criterion) { +fn chunk_by_lazy_2(c: &mut Criterion) { let mut data = vec![0; 1024]; for (index, elt) in data.iter_mut().enumerate() { *elt = index / 2; @@ -413,10 +347,10 @@ fn group_by_lazy_2(c: &mut Criterion) { let data = black_box(data); - c.bench_function("group by lazy 2", move |b| { + c.bench_function("chunk by lazy 2", move |b| { b.iter(|| { - for (_key, group) in &data.iter().group_by(|elt| **elt) { - for elt in group { + for (_key, chunk) in &data.iter().chunk_by(|elt| **elt) { + for elt in chunk { black_box(elt); } } @@ -432,8 +366,8 @@ fn slice_chunks(c: &mut Criterion) { c.bench_function("slice chunks", move |b| { b.iter(|| { - for group in data.chunks(sz) { - for elt in group { + for chunk in data.chunks(sz) { + for elt in chunk { black_box(elt); } } @@ -449,8 +383,8 @@ fn chunks_lazy_1(c: &mut Criterion) { c.bench_function("chunks lazy 1", move |b| { b.iter(|| { - for group in &data.iter().chunks(sz) { - for elt in group { + for chunk in &data.iter().chunks(sz) { + for elt in chunk { black_box(elt); } } @@ -464,17 +398,15 @@ fn equal(c: &mut Criterion) { let alpha = black_box(&data[1..]); let beta = black_box(&data[..l - 1]); - c.bench_function("equal", move |b| { - b.iter(|| { - itertools::equal(alpha, beta) - }) - }); + c.bench_function("equal", move |b| b.iter(|| itertools::equal(alpha, beta))); } fn merge_default(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop, clippy::unused_enumerate_index)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -493,9 +425,7 @@ fn merge_default(c: &mut Criterion) { let data2 = black_box(data2); c.bench_function("merge default", move |b| { - b.iter(|| { - data1.iter().merge(&data2).count() - }) + b.iter(|| data1.iter().merge(&data2).count()) }); } @@ -503,6 +433,8 @@ fn merge_by_cmp(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop, clippy::unused_enumerate_index)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -521,9 +453,7 @@ fn merge_by_cmp(c: &mut Criterion) { let data2 = black_box(data2); c.bench_function("merge by cmp", move |b| { - b.iter(|| { - data1.iter().merge_by(&data2, PartialOrd::le).count() - }) + b.iter(|| data1.iter().merge_by(&data2, PartialOrd::le).count()) }); } @@ -531,6 +461,8 @@ fn merge_by_lt(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop, clippy::unused_enumerate_index)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -549,9 +481,7 @@ fn merge_by_lt(c: &mut Criterion) { let data2 = black_box(data2); c.bench_function("merge by lt", move |b| { - b.iter(|| { - data1.iter().merge_by(&data2, |a, b| a <= b).count() - }) + b.iter(|| data1.iter().merge_by(&data2, |a, b| a <= b).count()) }); } @@ -559,6 +489,8 @@ fn kmerge_default(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop, clippy::unused_enumerate_index)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -578,9 +510,7 @@ fn kmerge_default(c: &mut Criterion) { let its = &[data1.iter(), data2.iter()]; c.bench_function("kmerge default", move |b| { - b.iter(|| { - its.iter().cloned().kmerge().count() - }) + b.iter(|| its.iter().cloned().kmerge().count()) }); } @@ -589,7 +519,7 @@ fn kmerge_tenway(c: &mut Criterion) { let mut state = 1729u16; fn rng(state: &mut u16) -> u16 { - let new = state.wrapping_mul(31421) + 6927; + let new = state.wrapping_mul(31421).wrapping_add(6927); *state = new; new } @@ -600,10 +530,10 @@ fn kmerge_tenway(c: &mut Criterion) { let mut chunks = Vec::new(); let mut rest = &mut data[..]; - while rest.len() > 0 { + while !rest.is_empty() { let chunk_len = 1 + rng(&mut state) % 512; let chunk_len = cmp::min(rest.len(), chunk_len as usize); - let (fst, tail) = {rest}.split_at_mut(chunk_len); + let (fst, tail) = { rest }.split_at_mut(chunk_len); fst.sort(); chunks.push(fst.iter().cloned()); rest = tail; @@ -612,15 +542,14 @@ fn kmerge_tenway(c: &mut Criterion) { // println!("Chunk lengths: {}", chunks.iter().format_with(", ", |elt, f| f(&elt.len()))); c.bench_function("kmerge tenway", move |b| { - b.iter(|| { - chunks.iter().cloned().kmerge().count() - }) + b.iter(|| chunks.iter().cloned().kmerge().count()) }); } fn fast_integer_sum(iter: I) -> I::Item - where I: IntoIterator, - I::Item: Default + Add +where + I: IntoIterator, + I::Item: Default + Add, { iter.into_iter().fold(<_>::default(), |x, y| x + y) } @@ -629,9 +558,7 @@ fn step_vec_2(c: &mut Criterion) { let v = vec![0; 1024]; c.bench_function("step vec 2", move |b| { - b.iter(|| { - fast_integer_sum(cloned(v.iter().step_by(2))) - }) + b.iter(|| fast_integer_sum(cloned(v.iter().step_by(2)))) }); } @@ -639,9 +566,7 @@ fn step_vec_10(c: &mut Criterion) { let v = vec![0; 1024]; c.bench_function("step vec 10", move |b| { - b.iter(|| { - fast_integer_sum(cloned(v.iter().step_by(10))) - }) + b.iter(|| fast_integer_sum(cloned(v.iter().step_by(10)))) }); } @@ -649,9 +574,7 @@ fn step_range_2(c: &mut Criterion) { let v = black_box(0..1024); c.bench_function("step range 2", move |b| { - b.iter(|| { - fast_integer_sum(v.clone().step_by(2)) - }) + b.iter(|| fast_integer_sum(v.clone().step_by(2))) }); } @@ -659,9 +582,23 @@ fn step_range_10(c: &mut Criterion) { let v = black_box(0..1024); c.bench_function("step range 10", move |b| { - b.iter(|| { - fast_integer_sum(v.clone().step_by(10)) - }) + b.iter(|| fast_integer_sum(v.clone().step_by(10))) + }); +} + +fn vec_iter_mut_partition(c: &mut Criterion) { + let data = std::iter::repeat(-1024i32..1024) + .take(256) + .flatten() + .collect_vec(); + c.bench_function("vec iter mut partition", move |b| { + b.iter_batched( + || data.clone(), + |mut data| { + black_box(itertools::partition(black_box(&mut data), |n| *n >= 0)); + }, + BatchSize::LargeInput, + ) }); } @@ -681,22 +618,6 @@ fn cartesian_product_iterator(c: &mut Criterion) { }); } -fn cartesian_product_fold(c: &mut Criterion) { - let xs = vec![0; 16]; - - c.bench_function("cartesian product fold", move |b| { - b.iter(|| { - let mut sum = 0; - iproduct!(&xs, &xs, &xs).fold((), |(), (&x, &y, &z)| { - sum += x; - sum += y; - sum += z; - }); - sum - }) - }); -} - fn multi_cartesian_product_iterator(c: &mut Criterion) { let xs = [vec![0; 16], vec![0; 16], vec![0; 16]]; @@ -713,22 +634,6 @@ fn multi_cartesian_product_iterator(c: &mut Criterion) { }); } -fn multi_cartesian_product_fold(c: &mut Criterion) { - let xs = [vec![0; 16], vec![0; 16], vec![0; 16]]; - - c.bench_function("multi cartesian product fold", move |b| { - b.iter(|| { - let mut sum = 0; - xs.iter().multi_cartesian_product().fold((), |(), x| { - sum += x[0]; - sum += x[1]; - sum += x[2]; - }); - sum - }) - }); -} - fn cartesian_product_nested_for(c: &mut Criterion) { let xs = vec![0; 16]; @@ -753,9 +658,7 @@ fn all_equal(c: &mut Criterion) { let mut xs = vec![0; 5_000_000]; xs.extend(vec![1; 5_000_000]); - c.bench_function("all equal", move |b| { - b.iter(|| xs.iter().all_equal()) - }); + c.bench_function("all equal", move |b| b.iter(|| xs.iter().all_equal())); } fn all_equal_for(c: &mut Criterion) { @@ -797,21 +700,17 @@ fn permutations_iter(c: &mut Criterion) { } c.bench_function("permutations iter", move |b| { - b.iter(|| { - for _ in NewIterator(0..PERM_COUNT).permutations(PERM_COUNT) { - - } - }) + b.iter( + || { + for _ in NewIterator(0..PERM_COUNT).permutations(PERM_COUNT) {} + }, + ) }); } fn permutations_range(c: &mut Criterion) { c.bench_function("permutations range", move |b| { - b.iter(|| { - for _ in (0..PERM_COUNT).permutations(PERM_COUNT) { - - } - }) + b.iter(|| for _ in (0..PERM_COUNT).permutations(PERM_COUNT) {}) }); } @@ -819,11 +718,7 @@ fn permutations_slice(c: &mut Criterion) { let v = (0..PERM_COUNT).collect_vec(); c.bench_function("permutations slice", move |b| { - b.iter(|| { - for _ in v.as_slice().iter().permutations(PERM_COUNT) { - - } - }) + b.iter(|| for _ in v.as_slice().iter().permutations(PERM_COUNT) {}) }); } @@ -836,10 +731,6 @@ criterion_group!( zipdot_f32_default_zip, zip_default_zip3, zip_slices_ziptuple, - zipslices, - zipslices_mut, - zipdot_i32_zipslices, - zipdot_f32_zipslices, zip_checked_counted_loop, zipdot_i32_checked_counted_loop, zipdot_f32_checked_counted_loop, @@ -848,8 +739,8 @@ criterion_group!( zipdot_i32_unchecked_counted_loop, zipdot_f32_unchecked_counted_loop, zip_unchecked_counted_loop3, - group_by_lazy_1, - group_by_lazy_2, + chunk_by_lazy_1, + chunk_by_lazy_2, slice_chunks, chunks_lazy_1, equal, @@ -862,10 +753,9 @@ criterion_group!( step_vec_10, step_range_2, step_range_10, + vec_iter_mut_partition, cartesian_product_iterator, - cartesian_product_fold, multi_cartesian_product_iterator, - multi_cartesian_product_fold, cartesian_product_nested_for, all_equal, all_equal_for, diff --git a/third_party/rust/itertools/benches/combinations.rs b/third_party/rust/itertools/benches/combinations.rs index e7433a4cb09..42a452111ea 100644 --- a/third_party/rust/itertools/benches/combinations.rs +++ b/third_party/rust/itertools/benches/combinations.rs @@ -111,15 +111,7 @@ fn comb_c14(c: &mut Criterion) { } criterion_group!( - benches, - comb_for1, - comb_for2, - comb_for3, - comb_for4, - comb_c1, - comb_c2, - comb_c3, - comb_c4, + benches, comb_for1, comb_for2, comb_for3, comb_for4, comb_c1, comb_c2, comb_c3, comb_c4, comb_c14, ); criterion_main!(benches); diff --git a/third_party/rust/itertools/benches/extra/mod.rs b/third_party/rust/itertools/benches/extra/mod.rs deleted file mode 100644 index 52fe5cc3fe0..00000000000 --- a/third_party/rust/itertools/benches/extra/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub use self::zipslices::ZipSlices; -mod zipslices; diff --git a/third_party/rust/itertools/benches/extra/zipslices.rs b/third_party/rust/itertools/benches/extra/zipslices.rs deleted file mode 100644 index 633be590686..00000000000 --- a/third_party/rust/itertools/benches/extra/zipslices.rs +++ /dev/null @@ -1,188 +0,0 @@ -use std::cmp; - -// Note: There are different ways to implement ZipSlices. -// This version performed the best in benchmarks. -// -// I also implemented a version with three pointers (tptr, tend, uptr), -// that mimiced slice::Iter and only checked bounds by using tptr == tend, -// but that was inferior to this solution. - -/// An iterator which iterates two slices simultaneously. -/// -/// `ZipSlices` acts like a double-ended `.zip()` iterator. -/// -/// It was intended to be more efficient than `.zip()`, and it was, then -/// rustc changed how it optimizes so it can not promise improved performance -/// at this time. -/// -/// Note that elements past the end of the shortest of the two slices are ignored. -/// -/// Iterator element type for `ZipSlices` is `(T::Item, U::Item)`. For example, -/// for a `ZipSlices<&'a [A], &'b mut [B]>`, the element type is `(&'a A, &'b mut B)`. -#[derive(Clone)] -pub struct ZipSlices { - t: T, - u: U, - len: usize, - index: usize, -} - -impl<'a, 'b, A, B> ZipSlices<&'a [A], &'b [B]> { - /// Create a new `ZipSlices` from slices `a` and `b`. - /// - /// Act like a double-ended `.zip()` iterator, but more efficiently. - /// - /// Note that elements past the end of the shortest of the two slices are ignored. - #[inline(always)] - pub fn new(a: &'a [A], b: &'b [B]) -> Self { - let minl = cmp::min(a.len(), b.len()); - ZipSlices { - t: a, - u: b, - len: minl, - index: 0, - } - } -} - -impl ZipSlices - where T: Slice, - U: Slice -{ - /// Create a new `ZipSlices` from slices `a` and `b`. - /// - /// Act like a double-ended `.zip()` iterator, but more efficiently. - /// - /// Note that elements past the end of the shortest of the two slices are ignored. - #[inline(always)] - pub fn from_slices(a: T, b: U) -> Self { - let minl = cmp::min(a.len(), b.len()); - ZipSlices { - t: a, - u: b, - len: minl, - index: 0, - } - } -} - -impl Iterator for ZipSlices - where T: Slice, - U: Slice -{ - type Item = (T::Item, U::Item); - - #[inline(always)] - fn next(&mut self) -> Option { - unsafe { - if self.index >= self.len { - None - } else { - let i = self.index; - self.index += 1; - Some(( - self.t.get_unchecked(i), - self.u.get_unchecked(i))) - } - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - let len = self.len - self.index; - (len, Some(len)) - } -} - -impl DoubleEndedIterator for ZipSlices - where T: Slice, - U: Slice -{ - #[inline(always)] - fn next_back(&mut self) -> Option { - unsafe { - if self.index >= self.len { - None - } else { - self.len -= 1; - let i = self.len; - Some(( - self.t.get_unchecked(i), - self.u.get_unchecked(i))) - } - } - } -} - -impl ExactSizeIterator for ZipSlices - where T: Slice, - U: Slice -{} - -unsafe impl Slice for ZipSlices - where T: Slice, - U: Slice -{ - type Item = (T::Item, U::Item); - - fn len(&self) -> usize { - self.len - self.index - } - - unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { - (self.t.get_unchecked(i), - self.u.get_unchecked(i)) - } -} - -/// A helper trait to let `ZipSlices` accept both `&[T]` and `&mut [T]`. -/// -/// Unsafe trait because: -/// -/// - Implementors must guarantee that `get_unchecked` is valid for all indices `0..len()`. -pub unsafe trait Slice { - /// The type of a reference to the slice's elements - type Item; - #[doc(hidden)] - fn len(&self) -> usize; - #[doc(hidden)] - unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item; -} - -unsafe impl<'a, T> Slice for &'a [T] { - type Item = &'a T; - #[inline(always)] - fn len(&self) -> usize { (**self).len() } - #[inline(always)] - unsafe fn get_unchecked(&mut self, i: usize) -> &'a T { - debug_assert!(i < self.len()); - (**self).get_unchecked(i) - } -} - -unsafe impl<'a, T> Slice for &'a mut [T] { - type Item = &'a mut T; - #[inline(always)] - fn len(&self) -> usize { (**self).len() } - #[inline(always)] - unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut T { - debug_assert!(i < self.len()); - // override the lifetime constraints of &mut &'a mut [T] - (*(*self as *mut [T])).get_unchecked_mut(i) - } -} - -#[test] -fn zipslices() { - - let xs = [1, 2, 3, 4, 5, 6]; - let ys = [1, 2, 3, 7]; - ::itertools::assert_equal(ZipSlices::new(&xs, &ys), xs.iter().zip(&ys)); - - let xs = [1, 2, 3, 4, 5, 6]; - let mut ys = [0; 6]; - for (x, y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) { - *y = *x; - } - ::itertools::assert_equal(&xs, &ys); -} diff --git a/third_party/rust/itertools/benches/fold_specialization.rs b/third_party/rust/itertools/benches/fold_specialization.rs index 5de4671e989..b44f3472146 100644 --- a/third_party/rust/itertools/benches/fold_specialization.rs +++ b/third_party/rust/itertools/benches/fold_specialization.rs @@ -1,10 +1,13 @@ +#![allow(unstable_name_collisions)] + use criterion::{criterion_group, criterion_main, Criterion}; use itertools::Itertools; struct Unspecialized(I); impl Iterator for Unspecialized -where I: Iterator +where + I: Iterator, { type Item = I::Item; @@ -25,8 +28,7 @@ mod specialization { pub mod intersperse { use super::*; - pub fn external(c: &mut Criterion) - { + pub fn external(c: &mut Criterion) { let arr = [1; 1024]; c.bench_function("external", move |b| { @@ -40,23 +42,23 @@ mod specialization { }); } - pub fn internal_specialized(c: &mut Criterion) - { + pub fn internal_specialized(c: &mut Criterion) { let arr = [1; 1024]; c.bench_function("internal specialized", move |b| { b.iter(|| { + #[allow(clippy::unnecessary_fold)] arr.iter().intersperse(&0).fold(0, |acc, x| acc + x) }) }); } - pub fn internal_unspecialized(c: &mut Criterion) - { + pub fn internal_unspecialized(c: &mut Criterion) { let arr = [1; 1024]; c.bench_function("internal unspecialized", move |b| { b.iter(|| { + #[allow(clippy::unnecessary_fold)] Unspecialized(arr.iter().intersperse(&0)).fold(0, |acc, x| acc + x) }) }); diff --git a/third_party/rust/itertools/benches/k_smallest.rs b/third_party/rust/itertools/benches/k_smallest.rs new file mode 100644 index 00000000000..509ed7f8abd --- /dev/null +++ b/third_party/rust/itertools/benches/k_smallest.rs @@ -0,0 +1,61 @@ +use criterion::{black_box, criterion_group, criterion_main, Bencher, BenchmarkId, Criterion}; +use itertools::Itertools; +use rand::{rngs::StdRng, seq::SliceRandom, SeedableRng}; + +fn strict(b: &mut Bencher, (k, vals): &(usize, &Vec)) { + b.iter(|| black_box(vals.iter()).k_smallest(*k)) +} + +fn relaxed(b: &mut Bencher, (k, vals): &(usize, &Vec)) { + b.iter(|| black_box(vals.iter()).k_smallest_relaxed(*k)) +} + +fn ascending(n: usize) -> Vec { + (0..n).collect() +} + +fn random(n: usize) -> Vec { + let mut vals = (0..n).collect_vec(); + vals.shuffle(&mut StdRng::seed_from_u64(42)); + vals +} + +fn descending(n: usize) -> Vec { + (0..n).rev().collect() +} + +fn k_smallest(c: &mut Criterion, order: &str, vals: fn(usize) -> Vec) { + let mut g = c.benchmark_group(format!("k-smallest/{order}")); + + for log_n in 20..23 { + let n = 1 << log_n; + + let vals = vals(n); + + for log_k in 7..10 { + let k = 1 << log_k; + + let params = format!("{log_n}/{log_k}"); + let input = (k, &vals); + g.bench_with_input(BenchmarkId::new("strict", ¶ms), &input, strict); + g.bench_with_input(BenchmarkId::new("relaxed", ¶ms), &input, relaxed); + } + } + + g.finish() +} + +fn k_smallest_asc(c: &mut Criterion) { + k_smallest(c, "asc", ascending); +} + +fn k_smallest_rand(c: &mut Criterion) { + k_smallest(c, "rand", random); +} + +fn k_smallest_desc(c: &mut Criterion) { + k_smallest(c, "desc", descending); +} + +criterion_group!(benches, k_smallest_asc, k_smallest_rand, k_smallest_desc); +criterion_main!(benches); diff --git a/third_party/rust/itertools/benches/powerset.rs b/third_party/rust/itertools/benches/powerset.rs index 074550bc449..018333d316c 100644 --- a/third_party/rust/itertools/benches/powerset.rs +++ b/third_party/rust/itertools/benches/powerset.rs @@ -20,17 +20,64 @@ fn powerset_n(c: &mut Criterion, n: usize) { }); } -fn powerset_0(c: &mut Criterion) { powerset_n(c, 0); } +fn powerset_n_fold(c: &mut Criterion, n: usize) { + let id = format!("powerset {} fold", n); + c.bench_function(id.as_str(), move |b| { + b.iter(|| { + for _ in 0..calc_iters(n) { + (0..n).powerset().fold(0, |s, elt| s + black_box(elt).len()); + } + }) + }); +} -fn powerset_1(c: &mut Criterion) { powerset_n(c, 1); } +fn powerset_0(c: &mut Criterion) { + powerset_n(c, 0); +} -fn powerset_2(c: &mut Criterion) { powerset_n(c, 2); } +fn powerset_1(c: &mut Criterion) { + powerset_n(c, 1); +} -fn powerset_4(c: &mut Criterion) { powerset_n(c, 4); } +fn powerset_2(c: &mut Criterion) { + powerset_n(c, 2); +} -fn powerset_8(c: &mut Criterion) { powerset_n(c, 8); } +fn powerset_4(c: &mut Criterion) { + powerset_n(c, 4); +} -fn powerset_12(c: &mut Criterion) { powerset_n(c, 12); } +fn powerset_8(c: &mut Criterion) { + powerset_n(c, 8); +} + +fn powerset_12(c: &mut Criterion) { + powerset_n(c, 12); +} + +fn powerset_0_fold(c: &mut Criterion) { + powerset_n_fold(c, 0); +} + +fn powerset_1_fold(c: &mut Criterion) { + powerset_n_fold(c, 1); +} + +fn powerset_2_fold(c: &mut Criterion) { + powerset_n_fold(c, 2); +} + +fn powerset_4_fold(c: &mut Criterion) { + powerset_n_fold(c, 4); +} + +fn powerset_8_fold(c: &mut Criterion) { + powerset_n_fold(c, 8); +} + +fn powerset_12_fold(c: &mut Criterion) { + powerset_n_fold(c, 12); +} criterion_group!( benches, @@ -40,5 +87,11 @@ criterion_group!( powerset_4, powerset_8, powerset_12, + powerset_0_fold, + powerset_1_fold, + powerset_2_fold, + powerset_4_fold, + powerset_8_fold, + powerset_12_fold, ); -criterion_main!(benches); \ No newline at end of file +criterion_main!(benches); diff --git a/third_party/rust/itertools/benches/specializations.rs b/third_party/rust/itertools/benches/specializations.rs new file mode 100644 index 00000000000..e70323f8e6c --- /dev/null +++ b/third_party/rust/itertools/benches/specializations.rs @@ -0,0 +1,669 @@ +#![allow(unstable_name_collisions)] + +use criterion::black_box; +use criterion::BenchmarkId; +use itertools::Itertools; + +const NTH_INPUTS: &[usize] = &[0, 1, 2, 4, 8]; + +/// Create multiple functions each defining a benchmark group about iterator methods. +/// +/// Each created group has functions with the following ids: +/// +/// - `next`, `size_hint`, `count`, `last`, `nth`, `collect`, `fold` +/// - and when marked as `DoubleEndedIterator`: `next_back`, `nth_back`, `rfold` +/// - and when marked as `ExactSizeIterator`: `len` +/// +/// Note that this macro can be called only once. +macro_rules! bench_specializations { + ( + $( + $name:ident { + $($extra:ident)* + {$( + $init:stmt; + )*} + $iterator:expr + } + )* + ) => { + $( + #[allow(unused_must_use)] + fn $name(c: &mut ::criterion::Criterion) { + let mut bench_group = c.benchmark_group(stringify!($name)); + $( + $init + )* + let bench_first_its = { + let mut bench_idx = 0; + [0; 1000].map(|_| { + let mut it = $iterator; + if bench_idx != 0 { + it.nth(bench_idx - 1); + } + bench_idx += 1; + it + }) + }; + bench_specializations!(@Iterator bench_group bench_first_its: $iterator); + $( + bench_specializations!(@$extra bench_group bench_first_its: $iterator); + )* + bench_group.finish(); + } + )* + + ::criterion::criterion_group!(benches, $($name, )*); + ::criterion::criterion_main!(benches); + }; + + (@Iterator $group:ident $first_its:ident: $iterator:expr) => { + $group.bench_function("next", |bencher| bencher.iter(|| { + let mut it = $iterator; + while let Some(x) = it.next() { + black_box(x); + } + })); + $group.bench_function("size_hint", |bencher| bencher.iter(|| { + $first_its.iter().for_each(|it| { + black_box(it.size_hint()); + }) + })); + $group.bench_function("count", |bencher| bencher.iter(|| { + $iterator.count() + })); + $group.bench_function("last", |bencher| bencher.iter(|| { + $iterator.last() + })); + for n in NTH_INPUTS { + $group.bench_with_input(BenchmarkId::new("nth", n), n, |bencher, n| bencher.iter(|| { + for start in 0_usize..10 { + let mut it = $iterator; + if let Some(s) = start.checked_sub(1) { + black_box(it.nth(s)); + } + while let Some(x) = it.nth(*n) { + black_box(x); + } + } + })); + } + $group.bench_function("collect", |bencher| bencher.iter(|| { + $iterator.collect::>() + })); + $group.bench_function("fold", |bencher| bencher.iter(|| { + $iterator.fold((), |(), x| { + black_box(x); + }) + })); + }; + + (@DoubleEndedIterator $group:ident $_first_its:ident: $iterator:expr) => { + $group.bench_function("next_back", |bencher| bencher.iter(|| { + let mut it = $iterator; + while let Some(x) = it.next_back() { + black_box(x); + } + })); + for n in NTH_INPUTS { + $group.bench_with_input(BenchmarkId::new("nth_back", n), n, |bencher, n| bencher.iter(|| { + for start in 0_usize..10 { + let mut it = $iterator; + if let Some(s) = start.checked_sub(1) { + black_box(it.nth_back(s)); + } + while let Some(x) = it.nth_back(*n) { + black_box(x); + } + } + })); + } + $group.bench_function("rfold", |bencher| bencher.iter(|| { + $iterator.rfold((), |(), x| { + black_box(x); + }) + })); + }; + + (@ExactSizeIterator $group:ident $first_its:ident: $_iterator:expr) => { + $group.bench_function("len", |bencher| bencher.iter(|| { + $first_its.iter().for_each(|it| { + black_box(it.len()); + }) + })); + }; +} + +// Usage examples: +// - For `ZipLongest::fold` only: +// cargo bench --bench specializations zip_longest/fold +// - For `.combinations(k).nth(8)`: +// cargo bench --bench specializations combinations./nth/8 +bench_specializations! { + interleave { + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 768]); + } + v1.iter().interleave(&v2) + } + interleave_shortest { + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 768]); + } + v1.iter().interleave_shortest(&v2) + } + batching { + { + let v = black_box(vec![0; 1024]); + } + v.iter().batching(Iterator::next) + } + tuple_windows1 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_windows::<(_,)>() + } + tuple_windows2 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_windows::<(_, _)>() + } + tuple_windows3 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_windows::<(_, _, _)>() + } + tuple_windows4 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_windows::<(_, _, _, _)>() + } + circular_tuple_windows1 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().circular_tuple_windows::<(_,)>() + } + circular_tuple_windows2 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().circular_tuple_windows::<(_, _)>() + } + circular_tuple_windows3 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().circular_tuple_windows::<(_, _, _)>() + } + circular_tuple_windows4 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().circular_tuple_windows::<(_, _, _, _)>() + } + tuples1 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuples::<(_,)>() + } + tuples2 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuples::<(_, _)>() + } + tuples3 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuples::<(_, _, _)>() + } + tuples4 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuples::<(_, _, _, _)>() + } + tuple_buffer { + ExactSizeIterator + { + let v = black_box(vec![0; 11]); + // Short but the buffer can't have 12 or more elements. + } + { + let mut it = v.iter().tuples::<(_, _, _, _, _, _, _, _, _, _, _, _)>(); + it.next(); // No element but it fills the buffer. + it.into_buffer() + } + } + cartesian_product { + { + let v = black_box(vec![0; 16]); + } + itertools::iproduct!(&v, &v, &v) + } + multi_cartesian_product { + { + let vs = black_box([0; 3].map(|_| vec![0; 16])); + } + vs.iter().multi_cartesian_product() + } + coalesce { + { + let v = black_box(vec![0; 1024]); + } + v.iter().coalesce(|x, y| if x == y { Ok(x) } else { Err((x, y)) }) + } + dedup { + { + let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec()); + } + v.iter().dedup() + } + dedup_by { + { + let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec()); + } + v.iter().dedup_by(PartialOrd::ge) + } + dedup_with_count { + { + let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec()); + } + v.iter().dedup_with_count() + } + dedup_by_with_count { + { + let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec()); + } + v.iter().dedup_by_with_count(PartialOrd::ge) + } + duplicates { + DoubleEndedIterator + { + let v = black_box((0..32).cycle().take(1024).collect_vec()); + } + v.iter().duplicates() + } + duplicates_by { + DoubleEndedIterator + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().duplicates_by(|x| *x % 10) + } + unique { + DoubleEndedIterator + { + let v = black_box((0..32).cycle().take(1024).collect_vec()); + } + v.iter().unique() + } + unique_by { + DoubleEndedIterator + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().unique_by(|x| *x % 50) + } + take_while_inclusive { + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().take_while_inclusive(|x| **x < 1000) + } + pad_using { + DoubleEndedIterator + ExactSizeIterator + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().copied().pad_using(2048, |i| 5 * i) + } + positions { + DoubleEndedIterator + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().positions(|x| x % 5 == 0) + } + update { + DoubleEndedIterator + ExactSizeIterator + { + let v = black_box((0_i32..1024).collect_vec()); + } + v.iter().copied().update(|x| *x *= 7) + } + tuple_combinations1 { + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_combinations::<(_,)>() + } + tuple_combinations2 { + { + let v = black_box(vec![0; 64]); + } + v.iter().tuple_combinations::<(_, _)>() + } + tuple_combinations3 { + { + let v = black_box(vec![0; 64]); + } + v.iter().tuple_combinations::<(_, _, _)>() + } + tuple_combinations4 { + { + let v = black_box(vec![0; 64]); + } + v.iter().tuple_combinations::<(_, _, _, _)>() + } + intersperse { + { + let v = black_box(vec![0; 1024]); + let n = black_box(0); + } + v.iter().intersperse(&n) + } + intersperse_with { + { + let v = black_box(vec![0; 1024]); + let n = black_box(0); + } + v.iter().intersperse_with(|| &n) + } + combinations1 { + { + let v = black_box(vec![0; 1792]); + } + v.iter().combinations(1) + } + combinations2 { + { + let v = black_box(vec![0; 60]); + } + v.iter().combinations(2) + } + combinations3 { + { + let v = black_box(vec![0; 23]); + } + v.iter().combinations(3) + } + combinations4 { + { + let v = black_box(vec![0; 16]); + } + v.iter().combinations(4) + } + combinations_with_replacement1 { + { + let v = black_box(vec![0; 4096]); + } + v.iter().combinations_with_replacement(1) + } + combinations_with_replacement2 { + { + let v = black_box(vec![0; 90]); + } + v.iter().combinations_with_replacement(2) + } + combinations_with_replacement3 { + { + let v = black_box(vec![0; 28]); + } + v.iter().combinations_with_replacement(3) + } + combinations_with_replacement4 { + { + let v = black_box(vec![0; 16]); + } + v.iter().combinations_with_replacement(4) + } + permutations1 { + { + let v = black_box(vec![0; 1024]); + } + v.iter().permutations(1) + } + permutations2 { + { + let v = black_box(vec![0; 36]); + } + v.iter().permutations(2) + } + permutations3 { + { + let v = black_box(vec![0; 12]); + } + v.iter().permutations(3) + } + permutations4 { + { + let v = black_box(vec![0; 8]); + } + v.iter().permutations(4) + } + powerset { + { + let v = black_box(vec![0; 10]); + } + v.iter().powerset() + } + while_some { + {} + (0..) + .map(black_box) + .map(|i| char::from_digit(i, 16)) + .while_some() + } + with_position { + ExactSizeIterator + { + let v = black_box((0..10240).collect_vec()); + } + v.iter().with_position() + } + zip_longest { + DoubleEndedIterator + ExactSizeIterator + { + let xs = black_box(vec![0; 1024]); + let ys = black_box(vec![0; 768]); + } + xs.iter().zip_longest(ys.iter()) + } + zip_eq { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().zip_eq(v.iter().rev()) + } + multizip { + DoubleEndedIterator + ExactSizeIterator + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 768]); + let v3 = black_box(vec![0; 2048]); + } + itertools::multizip((&v1, &v2, &v3)) + } + izip { + DoubleEndedIterator + ExactSizeIterator + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 768]); + let v3 = black_box(vec![0; 2048]); + } + itertools::izip!(&v1, &v2, &v3) + } + put_back { + { + let v = black_box(vec![0; 1024]); + } + itertools::put_back(&v).with_value(black_box(&0)) + } + put_back_n { + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 16]); + } + { + let mut it = itertools::put_back_n(&v1); + for n in &v2 { + it.put_back(n); + } + it + } + } + exactly_one_error { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + // Use `at_most_one` would be similar. + v.iter().exactly_one().unwrap_err() + } + multipeek { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + let n = black_box(16); + } + { + let mut it = v.iter().multipeek(); + for _ in 0..n { + it.peek(); + } + it + } + } + peek_nth { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + let n = black_box(16); + } + { + let mut it = itertools::peek_nth(&v); + it.peek_nth(n); + it + } + } + repeat_n { + DoubleEndedIterator + ExactSizeIterator + {} + itertools::repeat_n(black_box(0), black_box(1024)) + } + merge { + { + let v1 = black_box((0..1024).collect_vec()); + let v2 = black_box((0..768).collect_vec()); + } + v1.iter().merge(&v2) + } + merge_by { + { + let v1 = black_box((0..1024).collect_vec()); + let v2 = black_box((0..768).collect_vec()); + } + v1.iter().merge_by(&v2, PartialOrd::ge) + } + merge_join_by_ordering { + { + let v1 = black_box((0..1024).collect_vec()); + let v2 = black_box((0..768).collect_vec()); + } + v1.iter().merge_join_by(&v2, Ord::cmp) + } + merge_join_by_bool { + { + let v1 = black_box((0..1024).collect_vec()); + let v2 = black_box((0..768).collect_vec()); + } + v1.iter().merge_join_by(&v2, PartialOrd::ge) + } + kmerge { + { + let vs = black_box(vec![vec![0; 1024], vec![0; 256], vec![0; 768]]); + } + vs.iter().kmerge() + } + kmerge_by { + { + let vs = black_box(vec![vec![0; 1024], vec![0; 256], vec![0; 768]]); + } + vs.iter().kmerge_by(PartialOrd::ge) + } + map_into { + DoubleEndedIterator + ExactSizeIterator + { + let v = black_box(vec![0_u8; 1024]); + } + v.iter().copied().map_into::() + } + map_ok { + DoubleEndedIterator + ExactSizeIterator + { + let v = black_box((0_u32..1024) + .map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) }) + .collect_vec()); + } + v.iter().copied().map_ok(|x| x + 1) + } + filter_ok { + DoubleEndedIterator + { + let v = black_box((0_u32..1024) + .map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) }) + .collect_vec()); + } + v.iter().copied().filter_ok(|x| x % 3 == 0) + } + filter_map_ok { + DoubleEndedIterator + { + let v = black_box((0_u32..1024) + .map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) }) + .collect_vec()); + } + v.iter().copied().filter_map_ok(|x| if x % 3 == 0 { Some(x + 1) } else { None }) + } + flatten_ok { + DoubleEndedIterator + { + let d = black_box(vec![0; 8]); + let v = black_box((0..512) + .map(|x| if x % 2 == 0 { Ok(&d) } else { Err(x) }) + .collect_vec()); + } + v.iter().copied().flatten_ok() + } +} diff --git a/third_party/rust/itertools/benches/tree_fold1.rs b/third_party/rust/itertools/benches/tree_reduce.rs similarity index 50% rename from third_party/rust/itertools/benches/tree_fold1.rs rename to third_party/rust/itertools/benches/tree_reduce.rs index f12995db8e3..051b1488348 100644 --- a/third_party/rust/itertools/benches/tree_fold1.rs +++ b/third_party/rust/itertools/benches/tree_reduce.rs @@ -1,12 +1,15 @@ -use criterion::{criterion_group, criterion_main, Criterion}; -use itertools::{Itertools, cloned}; +#![allow(deprecated)] -trait IterEx : Iterator { +use criterion::{criterion_group, criterion_main, Criterion}; +use itertools::{cloned, Itertools}; + +trait IterEx: Iterator { // Another efficient implementation against which to compare, // but needs `std` so is less desirable. - fn tree_fold1_vec(self, mut f: F) -> Option - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, + fn tree_reduce_vec(self, mut f: F) -> Option + where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, { let hint = self.size_hint().0; let cap = std::mem::size_of::() * 8 - hint.leading_zeros() as usize; @@ -21,24 +24,23 @@ trait IterEx : Iterator { stack.into_iter().fold1(f) } } -impl IterEx for T {} +impl IterEx for T {} macro_rules! def_benchs { ($N:expr, $FUN:ident, $BENCH_NAME:ident, - ) => ( + ) => { mod $BENCH_NAME { use super::*; pub fn sum(c: &mut Criterion) { - let v: Vec = (0.. $N).collect(); + let v: Vec = (0..$N).collect(); - c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " sum"), move |b| { - b.iter(|| { - cloned(&v).$FUN(|x, y| x + y) - }) - }); + c.bench_function( + &(stringify!($BENCH_NAME).replace('_', " ") + " sum"), + move |b| b.iter(|| cloned(&v).$FUN(|x, y| x + y)), + ); } pub fn complex_iter(c: &mut Criterion) { @@ -46,11 +48,10 @@ macro_rules! def_benchs { let v = (5..).take($N / 2); let it = u.chain(v); - c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " complex iter"), move |b| { - b.iter(|| { - it.clone().map(|x| x as f32).$FUN(f32::atan2) - }) - }); + c.bench_function( + &(stringify!($BENCH_NAME).replace('_', " ") + " complex iter"), + move |b| b.iter(|| it.clone().map(|x| x as f32).$FUN(f32::atan2)), + ); } pub fn string_format(c: &mut Criterion) { @@ -58,13 +59,18 @@ macro_rules! def_benchs { // size to not waste too much time in travis. The allocations // in here are so expensive anyway that it'll still take // way longer per iteration than the other two benchmarks. - let v: Vec = (0.. ($N/4)).collect(); + let v: Vec = (0..($N / 4)).collect(); - c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " string format"), move |b| { - b.iter(|| { - cloned(&v).map(|x| x.to_string()).$FUN(|x, y| format!("{} + {}", x, y)) - }) - }); + c.bench_function( + &(stringify!($BENCH_NAME).replace('_', " ") + " string format"), + move |b| { + b.iter(|| { + cloned(&v) + .map(|x| x.to_string()) + .$FUN(|x, y| format!("{} + {}", x, y)) + }) + }, + ); } } @@ -74,71 +80,71 @@ macro_rules! def_benchs { $BENCH_NAME::complex_iter, $BENCH_NAME::string_format, ); - ) + }; } -def_benchs!{ +def_benchs! { 10_000, fold1, fold1_10k, } -def_benchs!{ +def_benchs! { 10_000, - tree_fold1, - tree_fold1_stack_10k, + tree_reduce, + tree_reduce_stack_10k, } -def_benchs!{ +def_benchs! { 10_000, - tree_fold1_vec, - tree_fold1_vec_10k, + tree_reduce_vec, + tree_reduce_vec_10k, } -def_benchs!{ +def_benchs! { 100, fold1, fold1_100, } -def_benchs!{ +def_benchs! { 100, - tree_fold1, - tree_fold1_stack_100, + tree_reduce, + tree_reduce_stack_100, } -def_benchs!{ +def_benchs! { 100, - tree_fold1_vec, - tree_fold1_vec_100, + tree_reduce_vec, + tree_reduce_vec_100, } -def_benchs!{ +def_benchs! { 8, fold1, fold1_08, } -def_benchs!{ +def_benchs! { 8, - tree_fold1, - tree_fold1_stack_08, + tree_reduce, + tree_reduce_stack_08, } -def_benchs!{ +def_benchs! { 8, - tree_fold1_vec, - tree_fold1_vec_08, + tree_reduce_vec, + tree_reduce_vec_08, } criterion_main!( fold1_10k, - tree_fold1_stack_10k, - tree_fold1_vec_10k, + tree_reduce_stack_10k, + tree_reduce_vec_10k, fold1_100, - tree_fold1_stack_100, - tree_fold1_vec_100, + tree_reduce_stack_100, + tree_reduce_vec_100, fold1_08, - tree_fold1_stack_08, - tree_fold1_vec_08, + tree_reduce_stack_08, + tree_reduce_vec_08, ); diff --git a/third_party/rust/itertools/benches/tuples.rs b/third_party/rust/itertools/benches/tuples.rs index ea50aaaee1c..2eca34712ad 100644 --- a/third_party/rust/itertools/benches/tuples.rs +++ b/third_party/rust/itertools/benches/tuples.rs @@ -33,7 +33,7 @@ fn sum_s4(s: &[u32]) -> u32 { s4(s[0], s[1], s[2], s[3]) } -fn sum_t1(s: &(&u32, )) -> u32 { +fn sum_t1(s: &(&u32,)) -> u32 { s1(*s.0) } @@ -60,9 +60,9 @@ macro_rules! def_benchs { $WINDOWS:ident; $FOR_CHUNKS:ident, $FOR_WINDOWS:ident - ) => ( + ) => { fn $FOR_CHUNKS(c: &mut Criterion) { - let v: Vec = (0.. $N * 1_000).collect(); + let v: Vec = (0..$N * 1_000).collect(); let mut s = 0; c.bench_function(&stringify!($FOR_CHUNKS).replace('_', " "), move |b| { b.iter(|| { @@ -90,7 +90,7 @@ macro_rules! def_benchs { } fn $TUPLES(c: &mut Criterion) { - let v: Vec = (0.. $N * 1_000).collect(); + let v: Vec = (0..$N * 1_000).collect(); let mut s = 0; c.bench_function(&stringify!($TUPLES).replace('_', " "), move |b| { b.iter(|| { @@ -103,7 +103,7 @@ macro_rules! def_benchs { } fn $CHUNKS(c: &mut Criterion) { - let v: Vec = (0.. $N * 1_000).collect(); + let v: Vec = (0..$N * 1_000).collect(); let mut s = 0; c.bench_function(&stringify!($CHUNKS).replace('_', " "), move |b| { b.iter(|| { @@ -150,10 +150,10 @@ macro_rules! def_benchs { $TUPLE_WINDOWS, $WINDOWS, ); - ) + }; } -def_benchs!{ +def_benchs! { 1; benches_1, sum_t1, @@ -166,7 +166,7 @@ def_benchs!{ for_windows_1 } -def_benchs!{ +def_benchs! { 2; benches_2, sum_t2, @@ -179,7 +179,7 @@ def_benchs!{ for_windows_2 } -def_benchs!{ +def_benchs! { 3; benches_3, sum_t3, @@ -192,7 +192,7 @@ def_benchs!{ for_windows_3 } -def_benchs!{ +def_benchs! { 4; benches_4, sum_t4, @@ -205,9 +205,4 @@ def_benchs!{ for_windows_4 } -criterion_main!( - benches_1, - benches_2, - benches_3, - benches_4, -); +criterion_main!(benches_1, benches_2, benches_3, benches_4,); diff --git a/third_party/rust/itertools/clippy.toml b/third_party/rust/itertools/clippy.toml deleted file mode 100644 index 0a5485386ed..00000000000 --- a/third_party/rust/itertools/clippy.toml +++ /dev/null @@ -1 +0,0 @@ -msrv = "1.36.0" diff --git a/third_party/rust/itertools/examples/iris.rs b/third_party/rust/itertools/examples/iris.rs index 987d9e9cba4..63f9c483260 100644 --- a/third_party/rust/itertools/examples/iris.rs +++ b/third_party/rust/itertools/examples/iris.rs @@ -3,14 +3,13 @@ /// and does some simple manipulations. /// /// Iterators and itertools functionality are used throughout. - use itertools::Itertools; use std::collections::HashMap; use std::iter::repeat; use std::num::ParseFloatError; use std::str::FromStr; -static DATA: &'static str = include_str!("iris.data"); +static DATA: &str = include_str!("iris.data"); #[derive(Clone, Debug)] struct Iris { @@ -18,6 +17,7 @@ struct Iris { data: [f32; 4], } +#[allow(dead_code)] // fields are currently ignored #[derive(Clone, Debug)] enum ParseError { Numeric(ParseFloatError), @@ -26,7 +26,7 @@ enum ParseError { impl From for ParseError { fn from(err: ParseFloatError) -> Self { - ParseError::Numeric(err) + Self::Numeric(err) } } @@ -35,8 +35,11 @@ impl FromStr for Iris { type Err = ParseError; fn from_str(s: &str) -> Result { - let mut iris = Iris { name: "".into(), data: [0.; 4] }; - let mut parts = s.split(",").map(str::trim); + let mut iris = Self { + name: "".into(), + data: [0.; 4], + }; + let mut parts = s.split(',').map(str::trim); // using Iterator::by_ref() for (index, part) in parts.by_ref().take(4).enumerate() { @@ -45,7 +48,7 @@ impl FromStr for Iris { if let Some(name) = parts.next() { iris.name = name.into(); } else { - return Err(ParseError::Other("Missing name")) + return Err(ParseError::Other("Missing name")); } Ok(iris) } @@ -53,12 +56,13 @@ impl FromStr for Iris { fn main() { // using Itertools::fold_results to create the result of parsing - let irises = DATA.lines() - .map(str::parse) - .fold_ok(Vec::new(), |mut v, iris: Iris| { - v.push(iris); - v - }); + let irises = DATA + .lines() + .map(str::parse) + .fold_ok(Vec::new(), |mut v, iris: Iris| { + v.push(iris); + v + }); let mut irises = match irises { Err(e) => { println!("Error parsing: {:?}", e); @@ -74,19 +78,18 @@ fn main() { let mut plot_symbols = "+ox".chars().cycle(); let mut symbolmap = HashMap::new(); - // using Itertools::group_by - for (species, species_group) in &irises.iter().group_by(|iris| &iris.name) { + // using Itertools::chunk_by + for (species, species_chunk) in &irises.iter().chunk_by(|iris| &iris.name) { // assign a plot symbol - symbolmap.entry(species).or_insert_with(|| { - plot_symbols.next().unwrap() - }); + symbolmap + .entry(species) + .or_insert_with(|| plot_symbols.next().unwrap()); println!("{} (symbol={})", species, symbolmap[species]); - for iris in species_group { + for iris in species_chunk { // using Itertools::format for lazy formatting println!("{:>3.1}", iris.data.iter().format(", ")); } - } // Look at all combinations of the four columns diff --git a/third_party/rust/itertools/src/adaptors/coalesce.rs b/third_party/rust/itertools/src/adaptors/coalesce.rs index 3df7cc5823f..ab1ab5255dd 100644 --- a/third_party/rust/itertools/src/adaptors/coalesce.rs +++ b/third_party/rust/itertools/src/adaptors/coalesce.rs @@ -4,62 +4,78 @@ use std::iter::FusedIterator; use crate::size_hint; #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct CoalesceBy +pub struct CoalesceBy where I: Iterator, + C: CountItem, { iter: I, - last: Option, + /// `last` is `None` while no item have been taken out of `iter` (at definition). + /// Then `last` will be `Some(Some(item))` until `iter` is exhausted, + /// in which case `last` will be `Some(None)`. + last: Option>, f: F, } -impl Clone for CoalesceBy +impl Clone for CoalesceBy where - I: Iterator, + I: Clone + Iterator, + F: Clone, + C: CountItem, + C::CItem: Clone, { clone_fields!(last, iter, f); } -impl fmt::Debug for CoalesceBy +impl fmt::Debug for CoalesceBy where I: Iterator + fmt::Debug, - T: fmt::Debug, + C: CountItem, + C::CItem: fmt::Debug, { - debug_fmt_fields!(CoalesceBy, iter); + debug_fmt_fields!(CoalesceBy, iter, last); } pub trait CoalescePredicate { fn coalesce_pair(&mut self, t: T, item: Item) -> Result; } -impl Iterator for CoalesceBy +impl Iterator for CoalesceBy where I: Iterator, - F: CoalescePredicate, + F: CoalescePredicate, + C: CountItem, { - type Item = T; + type Item = C::CItem; fn next(&mut self) -> Option { + let Self { iter, last, f } = self; // this fuses the iterator - let last = self.last.take()?; + let init = match last { + Some(elt) => elt.take(), + None => { + *last = Some(None); + iter.next().map(C::new) + } + }?; - let self_last = &mut self.last; - let self_f = &mut self.f; Some( - self.iter - .try_fold(last, |last, next| match self_f.coalesce_pair(last, next) { - Ok(joined) => Ok(joined), - Err((last_, next_)) => { - *self_last = Some(next_); - Err(last_) - } - }) - .unwrap_or_else(|x| x), + iter.try_fold(init, |accum, next| match f.coalesce_pair(accum, next) { + Ok(joined) => Ok(joined), + Err((last_, next_)) => { + *last = Some(Some(next_)); + Err(last_) + } + }) + .unwrap_or_else(|x| x), ) } fn size_hint(&self) -> (usize, Option) { - let (low, hi) = size_hint::add_scalar(self.iter.size_hint(), self.last.is_some() as usize); + let (low, hi) = size_hint::add_scalar( + self.iter.size_hint(), + matches!(self.last, Some(Some(_))) as usize, + ); ((low > 0) as usize, hi) } @@ -67,9 +83,13 @@ where where FnAcc: FnMut(Acc, Self::Item) -> Acc, { - if let Some(last) = self.last { - let mut f = self.f; - let (last, acc) = self.iter.fold((last, acc), |(last, acc), elt| { + let Self { + mut iter, + last, + mut f, + } = self; + if let Some(last) = last.unwrap_or_else(|| iter.next().map(C::new)) { + let (last, acc) = iter.fold((last, acc), |(last, acc), elt| { match f.coalesce_pair(last, elt) { Ok(joined) => (joined, acc), Err((last_, next_)) => (next_, fn_acc(acc, last_)), @@ -82,12 +102,43 @@ where } } -impl, T> FusedIterator for CoalesceBy {} +impl FusedIterator for CoalesceBy +where + I: Iterator, + F: CoalescePredicate, + C: CountItem, +{ +} + +pub struct NoCount; + +pub struct WithCount; + +pub trait CountItem { + type CItem; + fn new(t: T) -> Self::CItem; +} + +impl CountItem for NoCount { + type CItem = T; + #[inline(always)] + fn new(t: T) -> T { + t + } +} + +impl CountItem for WithCount { + type CItem = (usize, T); + #[inline(always)] + fn new(t: T) -> (usize, T) { + (1, t) + } +} /// An iterator adaptor that may join together adjacent elements. /// /// See [`.coalesce()`](crate::Itertools::coalesce) for more information. -pub type Coalesce = CoalesceBy::Item>; +pub type Coalesce = CoalesceBy; impl CoalescePredicate for F where @@ -99,12 +150,12 @@ where } /// Create a new `Coalesce`. -pub fn coalesce(mut iter: I, f: F) -> Coalesce +pub fn coalesce(iter: I, f: F) -> Coalesce where I: Iterator, { Coalesce { - last: iter.next(), + last: None, iter, f, } @@ -113,7 +164,7 @@ where /// An iterator adaptor that removes repeated duplicates, determining equality using a comparison function. /// /// See [`.dedup_by()`](crate::Itertools::dedup_by) or [`.dedup()`](crate::Itertools::dedup) for more information. -pub type DedupBy = CoalesceBy, ::Item>; +pub type DedupBy = CoalesceBy, NoCount>; #[derive(Clone)] pub struct DedupPred2CoalescePred(DP); @@ -156,12 +207,12 @@ impl bool> DedupPredicate for F { } /// Create a new `DedupBy`. -pub fn dedup_by(mut iter: I, dedup_pred: Pred) -> DedupBy +pub fn dedup_by(iter: I, dedup_pred: Pred) -> DedupBy where I: Iterator, { DedupBy { - last: iter.next(), + last: None, iter, f: DedupPred2CoalescePred(dedup_pred), } @@ -186,7 +237,7 @@ where /// See [`.dedup_by_with_count()`](crate::Itertools::dedup_by_with_count) or /// [`.dedup_with_count()`](crate::Itertools::dedup_with_count) for more information. pub type DedupByWithCount = - CoalesceBy, (usize, ::Item)>; + CoalesceBy, WithCount>; #[derive(Clone, Debug)] pub struct DedupPredWithCount2CoalescePred(DP); @@ -215,12 +266,12 @@ where pub type DedupWithCount = DedupByWithCount; /// Create a new `DedupByWithCount`. -pub fn dedup_by_with_count(mut iter: I, dedup_pred: Pred) -> DedupByWithCount +pub fn dedup_by_with_count(iter: I, dedup_pred: Pred) -> DedupByWithCount where I: Iterator, { DedupByWithCount { - last: iter.next().map(|v| (1, v)), + last: None, iter, f: DedupPredWithCount2CoalescePred(dedup_pred), } diff --git a/third_party/rust/itertools/src/adaptors/map.rs b/third_party/rust/itertools/src/adaptors/map.rs index cf5e5a00d55..c78b9be6980 100644 --- a/third_party/rust/itertools/src/adaptors/map.rs +++ b/third_party/rust/itertools/src/adaptors/map.rs @@ -4,8 +4,8 @@ use std::marker::PhantomData; #[derive(Clone, Debug)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct MapSpecialCase { - iter: I, - f: F, + pub(crate) iter: I, + pub(crate) f: F, } pub trait MapSpecialCaseFn { @@ -67,10 +67,6 @@ where /// See [`.map_ok()`](crate::Itertools::map_ok) for more information. pub type MapOk = MapSpecialCase>; -/// See [`MapOk`]. -#[deprecated(note = "Use MapOk instead", since = "0.10.0")] -pub type MapResults = MapOk; - impl MapSpecialCaseFn> for MapSpecialCaseFnOk where F: FnMut(T) -> U, @@ -112,9 +108,19 @@ impl, U> MapSpecialCaseFn for MapSpecialCaseFnInto { } } -#[derive(Clone, Debug)] pub struct MapSpecialCaseFnInto(PhantomData); +impl std::fmt::Debug for MapSpecialCaseFnInto { + debug_fmt_fields!(MapSpecialCaseFnInto, 0); +} + +impl Clone for MapSpecialCaseFnInto { + #[inline] + fn clone(&self) -> Self { + Self(PhantomData) + } +} + /// Create a new [`MapInto`] iterator. pub fn map_into(iter: I) -> MapInto { MapSpecialCase { diff --git a/third_party/rust/itertools/src/adaptors/mod.rs b/third_party/rust/itertools/src/adaptors/mod.rs index 1695bbd6550..77192f26eb7 100644 --- a/third_party/rust/itertools/src/adaptors/mod.rs +++ b/third_party/rust/itertools/src/adaptors/mod.rs @@ -5,19 +5,17 @@ //! except according to those terms. mod coalesce; -mod map; +pub(crate) mod map; mod multi_product; pub use self::coalesce::*; pub use self::map::{map_into, map_ok, MapInto, MapOk}; -#[allow(deprecated)] -pub use self::map::MapResults; #[cfg(feature = "use_alloc")] pub use self::multi_product::*; +use crate::size_hint::{self, SizeHint}; use std::fmt; -use std::iter::{Fuse, Peekable, FromIterator, FusedIterator}; +use std::iter::{Enumerate, FromIterator, Fuse, FusedIterator}; use std::marker::PhantomData; -use crate::size_hint; /// An iterator adaptor that alternates elements from two iterators until both /// run out. @@ -28,55 +26,90 @@ use crate::size_hint; #[derive(Clone, Debug)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Interleave { - a: Fuse, - b: Fuse, - flag: bool, + i: Fuse, + j: Fuse, + next_coming_from_j: bool, } /// Create an iterator that interleaves elements in `i` and `j`. /// -/// [`IntoIterator`] enabled version of `[Itertools::interleave]`. -pub fn interleave(i: I, j: J) -> Interleave<::IntoIter, ::IntoIter> - where I: IntoIterator, - J: IntoIterator +/// [`IntoIterator`] enabled version of [`Itertools::interleave`](crate::Itertools::interleave). +pub fn interleave( + i: I, + j: J, +) -> Interleave<::IntoIter, ::IntoIter> +where + I: IntoIterator, + J: IntoIterator, { Interleave { - a: i.into_iter().fuse(), - b: j.into_iter().fuse(), - flag: false, + i: i.into_iter().fuse(), + j: j.into_iter().fuse(), + next_coming_from_j: false, } } impl Iterator for Interleave - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { type Item = I::Item; #[inline] fn next(&mut self) -> Option { - self.flag = !self.flag; - if self.flag { - match self.a.next() { - None => self.b.next(), + self.next_coming_from_j = !self.next_coming_from_j; + if self.next_coming_from_j { + match self.i.next() { + None => self.j.next(), r => r, } } else { - match self.b.next() { - None => self.a.next(), + match self.j.next() { + None => self.i.next(), r => r, } } } fn size_hint(&self) -> (usize, Option) { - size_hint::add(self.a.size_hint(), self.b.size_hint()) + size_hint::add(self.i.size_hint(), self.j.size_hint()) + } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let Self { + mut i, + mut j, + next_coming_from_j, + } = self; + if next_coming_from_j { + match j.next() { + Some(y) => init = f(init, y), + None => return i.fold(init, f), + } + } + let res = i.try_fold(init, |mut acc, x| { + acc = f(acc, x); + match j.next() { + Some(y) => Ok(f(acc, y)), + None => Err(acc), + } + }); + match res { + Ok(acc) => j.fold(acc, f), + Err(acc) => i.fold(acc, f), + } } } impl FusedIterator for Interleave - where I: Iterator, - J: Iterator -{} +where + I: Iterator, + J: Iterator, +{ +} /// An iterator adaptor that alternates elements from the two iterators until /// one of them runs out. @@ -88,37 +121,44 @@ impl FusedIterator for Interleave #[derive(Clone, Debug)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct InterleaveShortest - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { - it0: I, - it1: J, - phase: bool, // false ==> it0, true ==> it1 + i: I, + j: J, + next_coming_from_j: bool, } /// Create a new `InterleaveShortest` iterator. -pub fn interleave_shortest(a: I, b: J) -> InterleaveShortest - where I: Iterator, - J: Iterator +pub fn interleave_shortest(i: I, j: J) -> InterleaveShortest +where + I: Iterator, + J: Iterator, { InterleaveShortest { - it0: a, - it1: b, - phase: false, + i, + j, + next_coming_from_j: false, } } impl Iterator for InterleaveShortest - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { type Item = I::Item; #[inline] fn next(&mut self) -> Option { - let e = if self.phase { self.it1.next() } else { self.it0.next() }; + let e = if self.next_coming_from_j { + self.j.next() + } else { + self.i.next() + }; if e.is_some() { - self.phase = !self.phase; + self.next_coming_from_j = !self.next_coming_from_j; } e } @@ -126,24 +166,23 @@ impl Iterator for InterleaveShortest #[inline] fn size_hint(&self) -> (usize, Option) { let (curr_hint, next_hint) = { - let it0_hint = self.it0.size_hint(); - let it1_hint = self.it1.size_hint(); - if self.phase { - (it1_hint, it0_hint) + let i_hint = self.i.size_hint(); + let j_hint = self.j.size_hint(); + if self.next_coming_from_j { + (j_hint, i_hint) } else { - (it0_hint, it1_hint) + (i_hint, j_hint) } }; let (curr_lower, curr_upper) = curr_hint; let (next_lower, next_upper) = next_hint; let (combined_lower, combined_upper) = size_hint::mul_scalar(size_hint::min(curr_hint, next_hint), 2); - let lower = - if curr_lower > next_lower { - combined_lower + 1 - } else { - combined_lower - }; + let lower = if curr_lower > next_lower { + combined_lower + 1 + } else { + combined_lower + }; let upper = { let extra_elem = match (curr_upper, next_upper) { (_, None) => false, @@ -158,20 +197,52 @@ impl Iterator for InterleaveShortest }; (lower, upper) } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let Self { + mut i, + mut j, + next_coming_from_j, + } = self; + if next_coming_from_j { + match j.next() { + Some(y) => init = f(init, y), + None => return init, + } + } + let res = i.try_fold(init, |mut acc, x| { + acc = f(acc, x); + match j.next() { + Some(y) => Ok(f(acc, y)), + None => Err(acc), + } + }); + match res { + Ok(val) => val, + Err(val) => val, + } + } } impl FusedIterator for InterleaveShortest - where I: FusedIterator, - J: FusedIterator -{} +where + I: FusedIterator, + J: FusedIterator, +{ +} #[derive(Clone, Debug)] /// An iterator adaptor that allows putting back a single /// item to the front of the iterator. /// /// Iterator element type is `I::Item`. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct PutBack - where I: Iterator +where + I: Iterator, { top: Option, iter: I, @@ -179,7 +250,8 @@ pub struct PutBack /// Create an iterator where you can put back a single item pub fn put_back(iterable: I) -> PutBack - where I: IntoIterator +where + I: IntoIterator, { PutBack { top: None, @@ -188,7 +260,8 @@ pub fn put_back(iterable: I) -> PutBack } impl PutBack - where I: Iterator +where + I: Iterator, { /// put back value `value` (builder method) pub fn with_value(mut self, value: I::Item) -> Self { @@ -199,21 +272,22 @@ impl PutBack /// Split the `PutBack` into its parts. #[inline] pub fn into_parts(self) -> (Option, I) { - let PutBack{top, iter} = self; + let Self { top, iter } = self; (top, iter) } /// Put back a single value to the front of the iterator. /// - /// If a value is already in the put back slot, it is overwritten. + /// If a value is already in the put back slot, it is returned. #[inline] - pub fn put_back(&mut self, x: I::Item) { - self.top = Some(x); + pub fn put_back(&mut self, x: I::Item) -> Option { + self.top.replace(x) } } impl Iterator for PutBack - where I: Iterator +where + I: Iterator, { type Item = I::Item; #[inline] @@ -252,7 +326,8 @@ impl Iterator for PutBack } fn all(&mut self, mut f: G) -> bool - where G: FnMut(Self::Item) -> bool + where + G: FnMut(Self::Item) -> bool, { if let Some(elt) = self.top.take() { if !f(elt) { @@ -263,7 +338,8 @@ impl Iterator for PutBack } fn fold(mut self, init: Acc, mut f: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, + where + G: FnMut(Acc, Self::Item) -> Acc, { let mut accum = init; if let Some(elt) = self.top.take() { @@ -282,10 +358,14 @@ impl Iterator for PutBack /// See [`.cartesian_product()`](crate::Itertools::cartesian_product) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Product - where I: Iterator +where + I: Iterator, { a: I, - a_cur: Option, + /// `a_cur` is `None` while no item have been taken out of `a` (at definition). + /// Then `a_cur` will be `Some(Some(item))` until `a` is exhausted, + /// in which case `a_cur` will be `Some(None)`. + a_cur: Option>, b: J, b_orig: J, } @@ -293,13 +373,14 @@ pub struct Product /// Create a new cartesian product iterator /// /// Iterator element type is `(I::Item, J::Item)`. -pub fn cartesian_product(mut i: I, j: J) -> Product - where I: Iterator, - J: Clone + Iterator, - I::Item: Clone +pub fn cartesian_product(i: I, j: J) -> Product +where + I: Iterator, + J: Clone + Iterator, + I::Item: Clone, { Product { - a_cur: i.next(), + a_cur: None, a: i, b: j.clone(), b_orig: j, @@ -307,54 +388,69 @@ pub fn cartesian_product(mut i: I, j: J) -> Product } impl Iterator for Product - where I: Iterator, - J: Clone + Iterator, - I::Item: Clone +where + I: Iterator, + J: Clone + Iterator, + I::Item: Clone, { type Item = (I::Item, J::Item); fn next(&mut self) -> Option { - let elt_b = match self.b.next() { + let Self { + a, + a_cur, + b, + b_orig, + } = self; + let elt_b = match b.next() { None => { - self.b = self.b_orig.clone(); - match self.b.next() { + *b = b_orig.clone(); + match b.next() { None => return None, Some(x) => { - self.a_cur = self.a.next(); + *a_cur = Some(a.next()); x } } } - Some(x) => x + Some(x) => x, }; - self.a_cur.as_ref().map(|a| (a.clone(), elt_b)) + a_cur + .get_or_insert_with(|| a.next()) + .as_ref() + .map(|a| (a.clone(), elt_b)) } fn size_hint(&self) -> (usize, Option) { - let has_cur = self.a_cur.is_some() as usize; // Not ExactSizeIterator because size may be larger than usize - let (b_min, b_max) = self.b.size_hint(); - // Compute a * b_orig + b for both lower and upper bound - size_hint::add( - size_hint::mul(self.a.size_hint(), self.b_orig.size_hint()), - (b_min * has_cur, b_max.map(move |x| x * has_cur))) + let mut sh = size_hint::mul(self.a.size_hint(), self.b_orig.size_hint()); + if matches!(self.a_cur, Some(Some(_))) { + sh = size_hint::add(sh, self.b.size_hint()); + } + sh } - fn fold(mut self, mut accum: Acc, mut f: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, + fn fold(self, mut accum: Acc, mut f: G) -> Acc + where + G: FnMut(Acc, Self::Item) -> Acc, { // use a split loop to handle the loose a_cur as well as avoiding to // clone b_orig at the end. - if let Some(mut a) = self.a_cur.take() { - let mut b = self.b; + let Self { + mut a, + a_cur, + mut b, + b_orig, + } = self; + if let Some(mut elt_a) = a_cur.unwrap_or_else(|| a.next()) { loop { - accum = b.fold(accum, |acc, elt| f(acc, (a.clone(), elt))); + accum = b.fold(accum, |acc, elt| f(acc, (elt_a.clone(), elt))); // we can only continue iterating a if we had a first element; - if let Some(next_a) = self.a.next() { - b = self.b_orig.clone(); - a = next_a; + if let Some(next_elt_a) = a.next() { + b = b_orig.clone(); + elt_a = next_elt_a; } else { break; } @@ -365,15 +461,17 @@ impl Iterator for Product } impl FusedIterator for Product - where I: FusedIterator, - J: Clone + FusedIterator, - I::Item: Clone -{} +where + I: FusedIterator, + J: Clone + FusedIterator, + I::Item: Clone, +{ +} /// A “meta iterator adaptor”. Its closure receives a reference to the iterator /// and may pick off as many elements as it likes, to produce the next iterator element. /// -/// Iterator element type is *X*, if the return type of `F` is *Option\*. +/// Iterator element type is `X` if the return type of `F` is `Option`. /// /// See [`.batching()`](crate::Itertools::batching) for more information. #[derive(Clone)] @@ -383,7 +481,10 @@ pub struct Batching { iter: I, } -impl fmt::Debug for Batching where I: fmt::Debug { +impl fmt::Debug for Batching +where + I: fmt::Debug, +{ debug_fmt_fields!(Batching, iter); } @@ -393,8 +494,9 @@ pub fn batching(iter: I, f: F) -> Batching { } impl Iterator for Batching - where I: Iterator, - F: FnMut(&mut I) -> Option +where + I: Iterator, + F: FnMut(&mut I) -> Option, { type Item = B; #[inline] @@ -403,205 +505,6 @@ impl Iterator for Batching } } -/// An iterator adaptor that steps a number elements in the base iterator -/// for each iteration. -/// -/// The iterator steps by yielding the next element from the base iterator, -/// then skipping forward *n-1* elements. -/// -/// See [`.step()`](crate::Itertools::step) for more information. -#[deprecated(note="Use std .step_by() instead", since="0.8.0")] -#[allow(deprecated)] -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Step { - iter: Fuse, - skip: usize, -} - -/// Create a `Step` iterator. -/// -/// **Panics** if the step is 0. -#[allow(deprecated)] -pub fn step(iter: I, step: usize) -> Step - where I: Iterator -{ - assert!(step != 0); - Step { - iter: iter.fuse(), - skip: step - 1, - } -} - -#[allow(deprecated)] -impl Iterator for Step - where I: Iterator -{ - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option { - let elt = self.iter.next(); - if self.skip > 0 { - self.iter.nth(self.skip - 1); - } - elt - } - - fn size_hint(&self) -> (usize, Option) { - let (low, high) = self.iter.size_hint(); - let div = |x: usize| { - if x == 0 { - 0 - } else { - 1 + (x - 1) / (self.skip + 1) - } - }; - (div(low), high.map(div)) - } -} - -// known size -#[allow(deprecated)] -impl ExactSizeIterator for Step - where I: ExactSizeIterator -{} - -pub trait MergePredicate { - fn merge_pred(&mut self, a: &T, b: &T) -> bool; -} - -#[derive(Clone, Debug)] -pub struct MergeLte; - -impl MergePredicate for MergeLte { - fn merge_pred(&mut self, a: &T, b: &T) -> bool { - a <= b - } -} - -/// An iterator adaptor that merges the two base iterators in ascending order. -/// If both base iterators are sorted (ascending), the result is sorted. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.merge()`](crate::Itertools::merge_by) for more information. -pub type Merge = MergeBy; - -/// Create an iterator that merges elements in `i` and `j`. -/// -/// [`IntoIterator`] enabled version of [`Itertools::merge`](crate::Itertools::merge). -/// -/// ``` -/// use itertools::merge; -/// -/// for elt in merge(&[1, 2, 3], &[2, 3, 4]) { -/// /* loop body */ -/// } -/// ``` -pub fn merge(i: I, j: J) -> Merge<::IntoIter, ::IntoIter> - where I: IntoIterator, - J: IntoIterator, - I::Item: PartialOrd -{ - merge_by_new(i, j, MergeLte) -} - -/// An iterator adaptor that merges the two base iterators in ascending order. -/// If both base iterators are sorted (ascending), the result is sorted. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.merge_by()`](crate::Itertools::merge_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MergeBy - where I: Iterator, - J: Iterator -{ - a: Peekable, - b: Peekable, - fused: Option, - cmp: F, -} - -impl fmt::Debug for MergeBy - where I: Iterator + fmt::Debug, J: Iterator + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(MergeBy, a, b); -} - -implbool> MergePredicate for F { - fn merge_pred(&mut self, a: &T, b: &T) -> bool { - self(a, b) - } -} - -/// Create a `MergeBy` iterator. -pub fn merge_by_new(a: I, b: J, cmp: F) -> MergeBy - where I: IntoIterator, - J: IntoIterator, - F: MergePredicate, -{ - MergeBy { - a: a.into_iter().peekable(), - b: b.into_iter().peekable(), - fused: None, - cmp, - } -} - -impl Clone for MergeBy - where I: Iterator, - J: Iterator, - Peekable: Clone, - Peekable: Clone, - F: Clone -{ - clone_fields!(a, b, fused, cmp); -} - -impl Iterator for MergeBy - where I: Iterator, - J: Iterator, - F: MergePredicate -{ - type Item = I::Item; - - fn next(&mut self) -> Option { - let less_than = match self.fused { - Some(lt) => lt, - None => match (self.a.peek(), self.b.peek()) { - (Some(a), Some(b)) => self.cmp.merge_pred(a, b), - (Some(_), None) => { - self.fused = Some(true); - true - } - (None, Some(_)) => { - self.fused = Some(false); - false - } - (None, None) => return None, - } - }; - if less_than { - self.a.next() - } else { - self.b.next() - } - } - - fn size_hint(&self) -> (usize, Option) { - // Not ExactSizeIterator because size may be larger than usize - size_hint::add(self.a.size_hint(), self.b.size_hint()) - } -} - -impl FusedIterator for MergeBy - where I: FusedIterator, - J: FusedIterator, - F: MergePredicate -{} - /// An iterator adaptor that borrows from a `Clone`-able iterator /// to only pick off elements while the predicate returns `true`. /// @@ -612,22 +515,25 @@ pub struct TakeWhileRef<'a, I: 'a, F> { f: F, } -impl<'a, I, F> fmt::Debug for TakeWhileRef<'a, I, F> - where I: Iterator + fmt::Debug, +impl fmt::Debug for TakeWhileRef<'_, I, F> +where + I: Iterator + fmt::Debug, { debug_fmt_fields!(TakeWhileRef, iter); } /// Create a new `TakeWhileRef` from a reference to clonable iterator. pub fn take_while_ref(iter: &mut I, f: F) -> TakeWhileRef - where I: Iterator + Clone +where + I: Iterator + Clone, { TakeWhileRef { iter, f } } -impl<'a, I, F> Iterator for TakeWhileRef<'a, I, F> - where I: Iterator + Clone, - F: FnMut(&I::Item) -> bool +impl Iterator for TakeWhileRef<'_, I, F> +where + I: Iterator + Clone, + F: FnMut(&I::Item) -> bool, { type Item = I::Item; @@ -667,7 +573,8 @@ pub fn while_some(iter: I) -> WhileSome { } impl Iterator for WhileSome - where I: Iterator> +where + I: Iterator>, { type Item = A; @@ -681,6 +588,22 @@ impl Iterator for WhileSome fn size_hint(&self) -> (usize, Option) { (0, self.iter.size_hint().1) } + + fn fold(mut self, acc: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + let res = self.iter.try_fold(acc, |acc, item| match item { + Some(item) => Ok(f(acc, item)), + None => Err(acc), + }); + + match res { + Ok(val) => val, + Err(val) => val, + } + } } /// An iterator to iterate through all combinations in a `Clone`-able iterator that produces tuples @@ -689,10 +612,11 @@ impl Iterator for WhileSome /// See [`.tuple_combinations()`](crate::Itertools::tuple_combinations) for more /// information. #[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[must_use = "this iterator adaptor is not lazy but does nearly nothing unless consumed"] pub struct TupleCombinations - where I: Iterator, - T: HasCombination +where + I: Iterator, + T: HasCombination, { iter: T::Combination, _mi: PhantomData, @@ -704,9 +628,10 @@ pub trait HasCombination: Sized { /// Create a new `TupleCombinations` from a clonable iterator. pub fn tuple_combinations(iter: I) -> TupleCombinations - where I: Iterator + Clone, - I::Item: Clone, - T: HasCombination, +where + I: Iterator + Clone, + I::Item: Clone, + T: HasCombination, { TupleCombinations { iter: T::Combination::from(iter), @@ -715,20 +640,38 @@ pub fn tuple_combinations(iter: I) -> TupleCombinations } impl Iterator for TupleCombinations - where I: Iterator, - T: HasCombination, +where + I: Iterator, + T: HasCombination, { type Item = T; fn next(&mut self) -> Option { self.iter.next() } + + fn size_hint(&self) -> SizeHint { + self.iter.size_hint() + } + + fn count(self) -> usize { + self.iter.count() + } + + fn fold(self, init: B, f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + self.iter.fold(init, f) + } } impl FusedIterator for TupleCombinations - where I: FusedIterator, - T: HasCombination, -{} +where + I: FusedIterator, + T: HasCombination, +{ +} #[derive(Clone, Debug)] pub struct Tuple1Combination { @@ -737,7 +680,7 @@ pub struct Tuple1Combination { impl From for Tuple1Combination { fn from(iter: I) -> Self { - Tuple1Combination { iter } + Self { iter } } } @@ -747,6 +690,21 @@ impl Iterator for Tuple1Combination { fn next(&mut self) -> Option { self.iter.next().map(|x| (x,)) } + + fn size_hint(&self) -> SizeHint { + self.iter.size_hint() + } + + fn count(self) -> usize { + self.iter.count() + } + + fn fold(self, init: B, f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + self.iter.map(|x| (x,)).fold(init, f) + } } impl HasCombination for (I::Item,) { @@ -780,22 +738,67 @@ macro_rules! impl_tuple_combination { impl Iterator for $C where I: Iterator + Clone, - I::Item: Clone + A: Clone, { type Item = (A, $(ignore_ident!($X, A)),*); fn next(&mut self) -> Option { - if let Some(($($X),*,)) = self.c.next() { + if let Some(($($X,)*)) = self.c.next() { let z = self.item.clone().unwrap(); Some((z, $($X),*)) } else { self.item = self.iter.next(); self.item.clone().and_then(|z| { self.c = self.iter.clone().into(); - self.c.next().map(|($($X),*,)| (z, $($X),*)) + self.c.next().map(|($($X,)*)| (z, $($X),*)) }) } } + + fn size_hint(&self) -> SizeHint { + const K: usize = 1 + count_ident!($($X)*); + let (mut n_min, mut n_max) = self.iter.size_hint(); + n_min = checked_binomial(n_min, K).unwrap_or(usize::MAX); + n_max = n_max.and_then(|n| checked_binomial(n, K)); + size_hint::add(self.c.size_hint(), (n_min, n_max)) + } + + fn count(self) -> usize { + const K: usize = 1 + count_ident!($($X)*); + let n = self.iter.count(); + checked_binomial(n, K).unwrap() + self.c.count() + } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + // We outline this closure to prevent it from unnecessarily + // capturing the type parameters `I`, `B`, and `F`. Not doing + // so ended up causing exponentially big types during MIR + // inlining when building itertools with optimizations enabled. + // + // This change causes a small improvement to compile times in + // release mode. + type CurrTuple
    = (A, $(ignore_ident!($X, A)),*); + type PrevTuple = ($(ignore_ident!($X, A),)*); + fn map_fn(z: &A) -> impl FnMut(PrevTuple) -> CurrTuple + '_ { + move |($($X,)*)| (z.clone(), $($X),*) + } + let Self { c, item, mut iter } = self; + if let Some(z) = item.as_ref() { + init = c + .map(map_fn::(z)) + .fold(init, &mut f); + } + while let Some(z) = iter.next() { + let c: $P = iter.clone().into(); + init = c + .map(map_fn::(&z)) + .fold(init, &mut f); + } + init + } } impl HasCombination for (A, $(ignore_ident!($X, A)),*) @@ -831,6 +834,42 @@ impl_tuple_combination!(Tuple10Combination Tuple9Combination; a b c d e f g h i) impl_tuple_combination!(Tuple11Combination Tuple10Combination; a b c d e f g h i j); impl_tuple_combination!(Tuple12Combination Tuple11Combination; a b c d e f g h i j k); +// https://en.wikipedia.org/wiki/Binomial_coefficient#In_programming_languages +pub(crate) fn checked_binomial(mut n: usize, mut k: usize) -> Option { + if n < k { + return Some(0); + } + // `factorial(n) / factorial(n - k) / factorial(k)` but trying to avoid it overflows: + k = (n - k).min(k); // symmetry + let mut c = 1; + for i in 1..=k { + c = (c / i) + .checked_mul(n)? + .checked_add((c % i).checked_mul(n)? / i)?; + n -= 1; + } + Some(c) +} + +#[test] +fn test_checked_binomial() { + // With the first row: [1, 0, 0, ...] and the first column full of 1s, we check + // row by row the recurrence relation of binomials (which is an equivalent definition). + // For n >= 1 and k >= 1 we have: + // binomial(n, k) == binomial(n - 1, k - 1) + binomial(n - 1, k) + const LIMIT: usize = 500; + let mut row = vec![Some(0); LIMIT + 1]; + row[0] = Some(1); + for n in 0..=LIMIT { + for k in 0..=LIMIT { + assert_eq!(row[k], checked_binomial(n, k)); + } + row = std::iter::once(Some(1)) + .chain((1..=LIMIT).map(|k| row[k - 1]?.checked_add(row[k]?))) + .collect(); + } +} + /// An iterator adapter to filter values within a nested `Result::Ok`. /// /// See [`.filter_ok()`](crate::Itertools::filter_ok) for more information. @@ -838,7 +877,7 @@ impl_tuple_combination!(Tuple12Combination Tuple11Combination; a b c d e f g h i #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct FilterOk { iter: I, - f: F + f: F, } impl fmt::Debug for FilterOk @@ -850,33 +889,26 @@ where /// Create a new `FilterOk` iterator. pub fn filter_ok(iter: I, f: F) -> FilterOk - where I: Iterator>, - F: FnMut(&T) -> bool, +where + I: Iterator>, + F: FnMut(&T) -> bool, { - FilterOk { - iter, - f, - } + FilterOk { iter, f } } impl Iterator for FilterOk - where I: Iterator>, - F: FnMut(&T) -> bool, +where + I: Iterator>, + F: FnMut(&T) -> bool, { type Item = Result; fn next(&mut self) -> Option { - loop { - match self.iter.next() { - Some(Ok(v)) => { - if (self.f)(&v) { - return Some(Ok(v)); - } - }, - Some(Err(e)) => return Some(Err(e)), - None => return None, - } - } + let f = &mut self.f; + self.iter.find(|res| match res { + Ok(t) => f(t), + _ => true, + }) } fn size_hint(&self) -> (usize, Option) { @@ -884,36 +916,65 @@ impl Iterator for FilterOk } fn fold(self, init: Acc, fold_f: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { let mut f = self.f; - self.iter.filter(|v| { - v.as_ref().map(&mut f).unwrap_or(true) - }).fold(init, fold_f) + self.iter + .filter(|v| v.as_ref().map(&mut f).unwrap_or(true)) + .fold(init, fold_f) } fn collect(self) -> C - where C: FromIterator + where + C: FromIterator, { let mut f = self.f; - self.iter.filter(|v| { - v.as_ref().map(&mut f).unwrap_or(true) - }).collect() + self.iter + .filter(|v| v.as_ref().map(&mut f).unwrap_or(true)) + .collect() + } +} + +impl DoubleEndedIterator for FilterOk +where + I: DoubleEndedIterator>, + F: FnMut(&T) -> bool, +{ + fn next_back(&mut self) -> Option { + let f = &mut self.f; + self.iter.rfind(|res| match res { + Ok(t) => f(t), + _ => true, + }) + } + + fn rfold(self, init: Acc, fold_f: Fold) -> Acc + where + Fold: FnMut(Acc, Self::Item) -> Acc, + { + let mut f = self.f; + self.iter + .filter(|v| v.as_ref().map(&mut f).unwrap_or(true)) + .rfold(init, fold_f) } } impl FusedIterator for FilterOk - where I: FusedIterator>, - F: FnMut(&T) -> bool, -{} +where + I: FusedIterator>, + F: FnMut(&T) -> bool, +{ +} /// An iterator adapter to filter and apply a transformation on values within a nested `Result::Ok`. /// /// See [`.filter_map_ok()`](crate::Itertools::filter_map_ok) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Clone)] pub struct FilterMapOk { iter: I, - f: F + f: F, } impl fmt::Debug for FilterMapOk @@ -933,33 +994,26 @@ fn transpose_result(result: Result, E>) -> Option> /// Create a new `FilterOk` iterator. pub fn filter_map_ok(iter: I, f: F) -> FilterMapOk - where I: Iterator>, - F: FnMut(T) -> Option, +where + I: Iterator>, + F: FnMut(T) -> Option, { - FilterMapOk { - iter, - f, - } + FilterMapOk { iter, f } } impl Iterator for FilterMapOk - where I: Iterator>, - F: FnMut(T) -> Option, +where + I: Iterator>, + F: FnMut(T) -> Option, { type Item = Result; fn next(&mut self) -> Option { - loop { - match self.iter.next() { - Some(Ok(v)) => { - if let Some(v) = (self.f)(v) { - return Some(Ok(v)); - } - }, - Some(Err(e)) => return Some(Err(e)), - None => return None, - } - } + let f = &mut self.f; + self.iter.find_map(|res| match res { + Ok(t) => f(t).map(Ok), + Err(e) => Some(Err(e)), + }) } fn size_hint(&self) -> (usize, Option) { @@ -967,28 +1021,56 @@ impl Iterator for FilterMapOk } fn fold(self, init: Acc, fold_f: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { let mut f = self.f; - self.iter.filter_map(|v| { - transpose_result(v.map(&mut f)) - }).fold(init, fold_f) + self.iter + .filter_map(|v| transpose_result(v.map(&mut f))) + .fold(init, fold_f) } fn collect(self) -> C - where C: FromIterator + where + C: FromIterator, { let mut f = self.f; - self.iter.filter_map(|v| { - transpose_result(v.map(&mut f)) - }).collect() + self.iter + .filter_map(|v| transpose_result(v.map(&mut f))) + .collect() + } +} + +impl DoubleEndedIterator for FilterMapOk +where + I: DoubleEndedIterator>, + F: FnMut(T) -> Option, +{ + fn next_back(&mut self) -> Option { + let f = &mut self.f; + self.iter.by_ref().rev().find_map(|res| match res { + Ok(t) => f(t).map(Ok), + Err(e) => Some(Err(e)), + }) + } + + fn rfold(self, init: Acc, fold_f: Fold) -> Acc + where + Fold: FnMut(Acc, Self::Item) -> Acc, + { + let mut f = self.f; + self.iter + .filter_map(|v| transpose_result(v.map(&mut f))) + .rfold(init, fold_f) } } impl FusedIterator for FilterMapOk - where I: FusedIterator>, - F: FnMut(T) -> Option, -{} +where + I: FusedIterator>, + F: FnMut(T) -> Option, +{ +} /// An iterator adapter to get the positions of each element that matches a predicate. /// @@ -996,70 +1078,90 @@ impl FusedIterator for FilterMapOk #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Positions { - iter: I, + iter: Enumerate, f: F, - count: usize, } impl fmt::Debug for Positions where I: fmt::Debug, { - debug_fmt_fields!(Positions, iter, count); + debug_fmt_fields!(Positions, iter); } /// Create a new `Positions` iterator. pub fn positions(iter: I, f: F) -> Positions - where I: Iterator, - F: FnMut(I::Item) -> bool, +where + I: Iterator, + F: FnMut(I::Item) -> bool, { - Positions { - iter, - f, - count: 0 - } + let iter = iter.enumerate(); + Positions { iter, f } } impl Iterator for Positions - where I: Iterator, - F: FnMut(I::Item) -> bool, +where + I: Iterator, + F: FnMut(I::Item) -> bool, { type Item = usize; fn next(&mut self) -> Option { - while let Some(v) = self.iter.next() { - let i = self.count; - self.count = i + 1; - if (self.f)(v) { - return Some(i); - } - } - None + let f = &mut self.f; + self.iter.find_map(|(count, val)| f(val).then_some(count)) } fn size_hint(&self) -> (usize, Option) { (0, self.iter.size_hint().1) } + + fn fold(self, init: B, mut func: G) -> B + where + G: FnMut(B, Self::Item) -> B, + { + let mut f = self.f; + self.iter.fold(init, |mut acc, (count, val)| { + if f(val) { + acc = func(acc, count); + } + acc + }) + } } impl DoubleEndedIterator for Positions - where I: DoubleEndedIterator + ExactSizeIterator, - F: FnMut(I::Item) -> bool, +where + I: DoubleEndedIterator + ExactSizeIterator, + F: FnMut(I::Item) -> bool, { fn next_back(&mut self) -> Option { - while let Some(v) = self.iter.next_back() { - if (self.f)(v) { - return Some(self.count + self.iter.len()) + let f = &mut self.f; + self.iter + .by_ref() + .rev() + .find_map(|(count, val)| f(val).then_some(count)) + } + + fn rfold(self, init: B, mut func: G) -> B + where + G: FnMut(B, Self::Item) -> B, + { + let mut f = self.f; + self.iter.rfold(init, |mut acc, (count, val)| { + if f(val) { + acc = func(acc, count); } - } - None + acc + }) } } impl FusedIterator for Positions - where I: FusedIterator, - F: FnMut(I::Item) -> bool, -{} +where + I: FusedIterator, + F: FnMut(I::Item) -> bool, +{ +} /// An iterator adapter to apply a mutating function to each element before yielding it. /// @@ -1108,18 +1210,28 @@ where } fn fold(self, init: Acc, mut g: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, + where + G: FnMut(Acc, Self::Item) -> Acc, { let mut f = self.f; - self.iter.fold(init, move |acc, mut v| { f(&mut v); g(acc, v) }) + self.iter.fold(init, move |acc, mut v| { + f(&mut v); + g(acc, v) + }) } // if possible, re-use inner iterator specializations in collect fn collect(self) -> C - where C: FromIterator + where + C: FromIterator, { let mut f = self.f; - self.iter.map(move |mut v| { f(&mut v); v }).collect() + self.iter + .map(move |mut v| { + f(&mut v); + v + }) + .collect() } } @@ -1127,7 +1239,8 @@ impl ExactSizeIterator for Update where I: ExactSizeIterator, F: FnMut(&mut I::Item), -{} +{ +} impl DoubleEndedIterator for Update where @@ -1148,4 +1261,5 @@ impl FusedIterator for Update where I: FusedIterator, F: FnMut(&mut I::Item), -{} +{ +} diff --git a/third_party/rust/itertools/src/adaptors/multi_product.rs b/third_party/rust/itertools/src/adaptors/multi_product.rs index 0b384069873..314d4a46ef9 100644 --- a/third_party/rust/itertools/src/adaptors/multi_product.rs +++ b/third_party/rust/itertools/src/adaptors/multi_product.rs @@ -1,29 +1,52 @@ #![cfg(feature = "use_alloc")] - -use crate::size_hint; -use crate::Itertools; +use Option::{self as State, None as ProductEnded, Some as ProductInProgress}; +use Option::{self as CurrentItems, None as NotYetPopulated, Some as Populated}; use alloc::vec::Vec; +use crate::size_hint; + #[derive(Clone)] /// An iterator adaptor that iterates over the cartesian product of /// multiple iterators of type `I`. /// -/// An iterator element type is `Vec`. +/// An iterator element type is `Vec`. /// /// See [`.multi_cartesian_product()`](crate::Itertools::multi_cartesian_product) /// for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MultiProduct(Vec>) - where I: Iterator + Clone, - I::Item: Clone; +pub struct MultiProduct(State>) +where + I: Iterator + Clone, + I::Item: Clone; + +#[derive(Clone)] +/// Internals for `MultiProduct`. +struct MultiProductInner +where + I: Iterator + Clone, + I::Item: Clone, +{ + /// Holds the iterators. + iters: Vec>, + /// Not populated at the beginning then it holds the current item of each iterator. + cur: CurrentItems>, +} impl std::fmt::Debug for MultiProduct where I: Iterator + Clone + std::fmt::Debug, I::Item: Clone + std::fmt::Debug, { - debug_fmt_fields!(CoalesceBy, 0); + debug_fmt_fields!(MultiProduct, 0); +} + +impl std::fmt::Debug for MultiProductInner +where + I: Iterator + Clone + std::fmt::Debug, + I::Item: Clone + std::fmt::Debug, +{ + debug_fmt_fields!(MultiProductInner, iters, cur); } /// Create a new cartesian product iterator over an arbitrary number @@ -31,200 +54,178 @@ where /// /// Iterator element is of type `Vec`. pub fn multi_cartesian_product(iters: H) -> MultiProduct<::IntoIter> - where H: Iterator, - H::Item: IntoIterator, - ::IntoIter: Clone, - ::Item: Clone +where + H: Iterator, + H::Item: IntoIterator, + ::IntoIter: Clone, + ::Item: Clone, { - MultiProduct(iters.map(|i| MultiProductIter::new(i.into_iter())).collect()) + let inner = MultiProductInner { + iters: iters + .map(|i| MultiProductIter::new(i.into_iter())) + .collect(), + cur: NotYetPopulated, + }; + MultiProduct(ProductInProgress(inner)) } #[derive(Clone, Debug)] /// Holds the state of a single iterator within a `MultiProduct`. struct MultiProductIter - where I: Iterator + Clone, - I::Item: Clone +where + I: Iterator + Clone, + I::Item: Clone, { - cur: Option, iter: I, iter_orig: I, } -/// Holds the current state during an iteration of a `MultiProduct`. -#[derive(Debug)] -enum MultiProductIterState { - StartOfIter, - MidIter { on_first_iter: bool }, -} - -impl MultiProduct - where I: Iterator + Clone, - I::Item: Clone -{ - /// Iterates the rightmost iterator, then recursively iterates iterators - /// to the left if necessary. - /// - /// Returns true if the iteration succeeded, else false. - fn iterate_last( - multi_iters: &mut [MultiProductIter], - mut state: MultiProductIterState - ) -> bool { - use self::MultiProductIterState::*; - - if let Some((last, rest)) = multi_iters.split_last_mut() { - let on_first_iter = match state { - StartOfIter => { - let on_first_iter = !last.in_progress(); - state = MidIter { on_first_iter }; - on_first_iter - }, - MidIter { on_first_iter } => on_first_iter - }; - - if !on_first_iter { - last.iterate(); - } - - if last.in_progress() { - true - } else if MultiProduct::iterate_last(rest, state) { - last.reset(); - last.iterate(); - // If iterator is None twice consecutively, then iterator is - // empty; whole product is empty. - last.in_progress() - } else { - false - } - } else { - // Reached end of iterator list. On initialisation, return true. - // At end of iteration (final iterator finishes), finish. - match state { - StartOfIter => false, - MidIter { on_first_iter } => on_first_iter - } - } - } - - /// Returns the unwrapped value of the next iteration. - fn curr_iterator(&self) -> Vec { - self.0.iter().map(|multi_iter| { - multi_iter.cur.clone().unwrap() - }).collect() - } - - /// Returns true if iteration has started and has not yet finished; false - /// otherwise. - fn in_progress(&self) -> bool { - if let Some(last) = self.0.last() { - last.in_progress() - } else { - false - } - } -} - impl MultiProductIter - where I: Iterator + Clone, - I::Item: Clone +where + I: Iterator + Clone, + I::Item: Clone, { fn new(iter: I) -> Self { - MultiProductIter { - cur: None, + Self { iter: iter.clone(), - iter_orig: iter + iter_orig: iter, } } - - /// Iterate the managed iterator. - fn iterate(&mut self) { - self.cur = self.iter.next(); - } - - /// Reset the managed iterator. - fn reset(&mut self) { - self.iter = self.iter_orig.clone(); - } - - /// Returns true if the current iterator has been started and has not yet - /// finished; false otherwise. - fn in_progress(&self) -> bool { - self.cur.is_some() - } } impl Iterator for MultiProduct - where I: Iterator + Clone, - I::Item: Clone +where + I: Iterator + Clone, + I::Item: Clone, { type Item = Vec; fn next(&mut self) -> Option { - if MultiProduct::iterate_last( - &mut self.0, - MultiProductIterState::StartOfIter - ) { - Some(self.curr_iterator()) - } else { - None + // This fuses the iterator. + let inner = self.0.as_mut()?; + match &mut inner.cur { + Populated(values) => { + debug_assert!(!inner.iters.is_empty()); + // Find (from the right) a non-finished iterator and + // reset the finished ones encountered. + for (iter, item) in inner.iters.iter_mut().zip(values.iter_mut()).rev() { + if let Some(new) = iter.iter.next() { + *item = new; + return Some(values.clone()); + } else { + iter.iter = iter.iter_orig.clone(); + // `cur` is populated so the untouched `iter_orig` can not be empty. + *item = iter.iter.next().unwrap(); + } + } + self.0 = ProductEnded; + None + } + // Only the first time. + NotYetPopulated => { + let next: Option> = inner.iters.iter_mut().map(|i| i.iter.next()).collect(); + if next.is_none() || inner.iters.is_empty() { + // This cartesian product had at most one item to generate and now ends. + self.0 = ProductEnded; + } else { + inner.cur.clone_from(&next); + } + next + } } } fn count(self) -> usize { - if self.0.is_empty() { - return 0; + match self.0 { + ProductEnded => 0, + // The iterator is fresh so the count is the product of the length of each iterator: + // - If one of them is empty, stop counting. + // - Less `count()` calls than the general case. + ProductInProgress(MultiProductInner { + iters, + cur: NotYetPopulated, + }) => iters + .into_iter() + .map(|iter| iter.iter_orig.count()) + .try_fold(1, |product, count| { + if count == 0 { + None + } else { + Some(product * count) + } + }) + .unwrap_or_default(), + // The general case. + ProductInProgress(MultiProductInner { + iters, + cur: Populated(_), + }) => iters.into_iter().fold(0, |mut acc, iter| { + if acc != 0 { + acc *= iter.iter_orig.count(); + } + acc + iter.iter.count() + }), } - - if !self.in_progress() { - return self.0.into_iter().fold(1, |acc, multi_iter| { - acc * multi_iter.iter.count() - }); - } - - self.0.into_iter().fold( - 0, - |acc, MultiProductIter { iter, iter_orig, cur: _ }| { - let total_count = iter_orig.count(); - let cur_count = iter.count(); - acc * total_count + cur_count - } - ) } fn size_hint(&self) -> (usize, Option) { - // Not ExactSizeIterator because size may be larger than usize - if self.0.is_empty() { - return (0, Some(0)); - } - - if !self.in_progress() { - return self.0.iter().fold((1, Some(1)), |acc, multi_iter| { - size_hint::mul(acc, multi_iter.iter.size_hint()) - }); - } - - self.0.iter().fold( - (0, Some(0)), - |acc, &MultiProductIter { ref iter, ref iter_orig, cur: _ }| { - let cur_size = iter.size_hint(); - let total_size = iter_orig.size_hint(); - size_hint::add(size_hint::mul(acc, total_size), cur_size) + match &self.0 { + ProductEnded => (0, Some(0)), + ProductInProgress(MultiProductInner { + iters, + cur: NotYetPopulated, + }) => iters + .iter() + .map(|iter| iter.iter_orig.size_hint()) + .fold((1, Some(1)), size_hint::mul), + ProductInProgress(MultiProductInner { + iters, + cur: Populated(_), + }) => { + if let [first, tail @ ..] = &iters[..] { + tail.iter().fold(first.iter.size_hint(), |mut sh, iter| { + sh = size_hint::mul(sh, iter.iter_orig.size_hint()); + size_hint::add(sh, iter.iter.size_hint()) + }) + } else { + // Since it is populated, this cartesian product has started so `iters` is not empty. + unreachable!() + } } - ) + } } fn last(self) -> Option { - let iter_count = self.0.len(); - - let lasts: Self::Item = self.0.into_iter() - .map(|multi_iter| multi_iter.iter.last()) - .while_some() - .collect(); - - if lasts.len() == iter_count { - Some(lasts) + let MultiProductInner { iters, cur } = self.0?; + // Collect the last item of each iterator of the product. + if let Populated(values) = cur { + let mut count = iters.len(); + let last = iters + .into_iter() + .zip(values) + .map(|(i, value)| { + i.iter.last().unwrap_or_else(|| { + // The iterator is empty, use its current `value`. + count -= 1; + value + }) + }) + .collect(); + if count == 0 { + // `values` was the last item. + None + } else { + Some(last) + } } else { - None + iters.into_iter().map(|i| i.iter.last()).collect() } } } + +impl std::iter::FusedIterator for MultiProduct +where + I: Iterator + Clone, + I::Item: Clone, +{ +} diff --git a/third_party/rust/itertools/src/combinations.rs b/third_party/rust/itertools/src/combinations.rs index 68a59c5e4d0..54a02755160 100644 --- a/third_party/rust/itertools/src/combinations.rs +++ b/third_party/rust/itertools/src/combinations.rs @@ -1,61 +1,258 @@ +use core::array; +use core::borrow::BorrowMut; use std::fmt; use std::iter::FusedIterator; use super::lazy_buffer::LazyBuffer; use alloc::vec::Vec; +use crate::adaptors::checked_binomial; + +/// Iterator for `Vec` valued combinations returned by [`.combinations()`](crate::Itertools::combinations) +pub type Combinations = CombinationsGeneric>; +/// Iterator for const generic combinations returned by [`.array_combinations()`](crate::Itertools::array_combinations) +pub type ArrayCombinations = CombinationsGeneric; + +/// Create a new `Combinations` from a clonable iterator. +pub fn combinations(iter: I, k: usize) -> Combinations +where + I::Item: Clone, +{ + Combinations::new(iter, (0..k).collect()) +} + +/// Create a new `ArrayCombinations` from a clonable iterator. +pub fn array_combinations(iter: I) -> ArrayCombinations +where + I::Item: Clone, +{ + ArrayCombinations::new(iter, array::from_fn(|i| i)) +} + /// An iterator to iterate through all the `k`-length combinations in an iterator. /// -/// See [`.combinations()`](crate::Itertools::combinations) for more information. +/// See [`.combinations()`](crate::Itertools::combinations) and [`.array_combinations()`](crate::Itertools::array_combinations) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Combinations { - indices: Vec, +pub struct CombinationsGeneric { + indices: Idx, pool: LazyBuffer, first: bool, } -impl Clone for Combinations - where I: Clone + Iterator, - I::Item: Clone, +/// A type holding indices of elements in a pool or buffer of items from an inner iterator +/// and used to pick out different combinations in a generic way. +pub trait PoolIndex: BorrowMut<[usize]> { + type Item; + + fn extract_item>(&self, pool: &LazyBuffer) -> Self::Item + where + T: Clone; + + fn len(&self) -> usize { + self.borrow().len() + } +} + +impl PoolIndex for Vec { + type Item = Vec; + + fn extract_item>(&self, pool: &LazyBuffer) -> Vec + where + T: Clone, + { + pool.get_at(self) + } +} + +impl PoolIndex for [usize; K] { + type Item = [T; K]; + + fn extract_item>(&self, pool: &LazyBuffer) -> [T; K] + where + T: Clone, + { + pool.get_array(*self) + } +} + +impl Clone for CombinationsGeneric +where + I: Iterator + Clone, + I::Item: Clone, + Idx: Clone, { clone_fields!(indices, pool, first); } -impl fmt::Debug for Combinations - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, +impl fmt::Debug for CombinationsGeneric +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, + Idx: fmt::Debug, { debug_fmt_fields!(Combinations, indices, pool, first); } -/// Create a new `Combinations` from a clonable iterator. -pub fn combinations(iter: I, k: usize) -> Combinations - where I: Iterator -{ - let mut pool = LazyBuffer::new(iter); - pool.prefill(k); - - Combinations { - indices: (0..k).collect(), - pool, - first: true, +impl> CombinationsGeneric { + /// Constructor with arguments the inner iterator and the initial state for the indices. + fn new(iter: I, indices: Idx) -> Self { + Self { + indices, + pool: LazyBuffer::new(iter), + first: true, + } } -} -impl Combinations { /// Returns the length of a combination produced by this iterator. #[inline] - pub fn k(&self) -> usize { self.indices.len() } + pub fn k(&self) -> usize { + self.indices.len() + } /// Returns the (current) length of the pool from which combination elements are /// selected. This value can change between invocations of [`next`](Combinations::next). #[inline] - pub fn n(&self) -> usize { self.pool.len() } + pub fn n(&self) -> usize { + self.pool.len() + } - /// Returns a reference to the source iterator. + /// Returns a reference to the source pool. #[inline] - pub(crate) fn src(&self) -> &I { &self.pool.it } + pub(crate) fn src(&self) -> &LazyBuffer { + &self.pool + } + /// Return the length of the inner iterator and the count of remaining combinations. + pub(crate) fn n_and_count(self) -> (usize, usize) { + let Self { + indices, + pool, + first, + } = self; + let n = pool.count(); + (n, remaining_for(n, first, indices.borrow()).unwrap()) + } + + /// Initialises the iterator by filling a buffer with elements from the + /// iterator. Returns true if there are no combinations, false otherwise. + fn init(&mut self) -> bool { + self.pool.prefill(self.k()); + let done = self.k() > self.n(); + if !done { + self.first = false; + } + + done + } + + /// Increments indices representing the combination to advance to the next + /// (in lexicographic order by increasing sequence) combination. For example + /// if we have n=4 & k=2 then `[0, 1] -> [0, 2] -> [0, 3] -> [1, 2] -> ...` + /// + /// Returns true if we've run out of combinations, false otherwise. + fn increment_indices(&mut self) -> bool { + // Borrow once instead of noise each time it's indexed + let indices = self.indices.borrow_mut(); + + if indices.is_empty() { + return true; // Done + } + // Scan from the end, looking for an index to increment + let mut i: usize = indices.len() - 1; + + // Check if we need to consume more from the iterator + if indices[i] == self.pool.len() - 1 { + self.pool.get_next(); // may change pool size + } + + while indices[i] == i + self.pool.len() - indices.len() { + if i > 0 { + i -= 1; + } else { + // Reached the last combination + return true; + } + } + + // Increment index, and reset the ones to its right + indices[i] += 1; + for j in i + 1..indices.len() { + indices[j] = indices[j - 1] + 1; + } + // If we've made it this far, we haven't run out of combos + false + } + + /// Returns the n-th item or the number of successful steps. + pub(crate) fn try_nth(&mut self, n: usize) -> Result<::Item, usize> + where + I: Iterator, + I::Item: Clone, + { + let done = if self.first { + self.init() + } else { + self.increment_indices() + }; + if done { + return Err(0); + } + for i in 0..n { + if self.increment_indices() { + return Err(i + 1); + } + } + Ok(self.indices.extract_item(&self.pool)) + } +} + +impl Iterator for CombinationsGeneric +where + I: Iterator, + I::Item: Clone, + Idx: PoolIndex, +{ + type Item = Idx::Item; + fn next(&mut self) -> Option { + let done = if self.first { + self.init() + } else { + self.increment_indices() + }; + + if done { + return None; + } + + Some(self.indices.extract_item(&self.pool)) + } + + fn nth(&mut self, n: usize) -> Option { + self.try_nth(n).ok() + } + + fn size_hint(&self) -> (usize, Option) { + let (mut low, mut upp) = self.pool.size_hint(); + low = remaining_for(low, self.first, self.indices.borrow()).unwrap_or(usize::MAX); + upp = upp.and_then(|upp| remaining_for(upp, self.first, self.indices.borrow())); + (low, upp) + } + + #[inline] + fn count(self) -> usize { + self.n_and_count().1 + } +} + +impl FusedIterator for CombinationsGeneric +where + I: Iterator, + I::Item: Clone, + Idx: PoolIndex, +{ +} + +impl Combinations { /// Resets this `Combinations` back to an initial state for combinations of length /// `k` over the same pool data source. If `k` is larger than the current length /// of the data pool an attempt is made to prefill the pool so that it holds `k` @@ -68,7 +265,6 @@ impl Combinations { for i in 0..k { self.indices[i] = i; } - } else { for i in 0..self.indices.len() { self.indices[i] = i; @@ -79,50 +275,34 @@ impl Combinations { } } -impl Iterator for Combinations - where I: Iterator, - I::Item: Clone -{ - type Item = Vec; - fn next(&mut self) -> Option { - if self.first { - if self.k() > self.n() { - return None; - } - self.first = false; - } else if self.indices.is_empty() { - return None; - } else { - // Scan from the end, looking for an index to increment - let mut i: usize = self.indices.len() - 1; +/// For a given size `n`, return the count of remaining combinations or None if it would overflow. +fn remaining_for(n: usize, first: bool, indices: &[usize]) -> Option { + let k = indices.len(); + if n < k { + Some(0) + } else if first { + checked_binomial(n, k) + } else { + // https://en.wikipedia.org/wiki/Combinatorial_number_system + // http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf - // Check if we need to consume more from the iterator - if self.indices[i] == self.pool.len() - 1 { - self.pool.get_next(); // may change pool size - } + // The combinations generated after the current one can be counted by counting as follows: + // - The subsequent combinations that differ in indices[0]: + // If subsequent combinations differ in indices[0], then their value for indices[0] + // must be at least 1 greater than the current indices[0]. + // As indices is strictly monotonically sorted, this means we can effectively choose k values + // from (n - 1 - indices[0]), leading to binomial(n - 1 - indices[0], k) possibilities. + // - The subsequent combinations with same indices[0], but differing indices[1]: + // Here we can choose k - 1 values from (n - 1 - indices[1]) values, + // leading to binomial(n - 1 - indices[1], k - 1) possibilities. + // - (...) + // - The subsequent combinations with same indices[0..=i], but differing indices[i]: + // Here we can choose k - i values from (n - 1 - indices[i]) values: binomial(n - 1 - indices[i], k - i). + // Since subsequent combinations can in any index, we must sum up the aforementioned binomial coefficients. - while self.indices[i] == i + self.pool.len() - self.indices.len() { - if i > 0 { - i -= 1; - } else { - // Reached the last combination - return None; - } - } - - // Increment index, and reset the ones to its right - self.indices[i] += 1; - for j in i+1..self.indices.len() { - self.indices[j] = self.indices[j - 1] + 1; - } - } - - // Create result vector based on the indices - Some(self.indices.iter().map(|i| self.pool[*i].clone()).collect()) + // Below, `n0` resembles indices[i]. + indices.iter().enumerate().try_fold(0usize, |sum, (i, n0)| { + sum.checked_add(checked_binomial(n - 1 - *n0, k - i)?) + }) } } - -impl FusedIterator for Combinations - where I: Iterator, - I::Item: Clone -{} diff --git a/third_party/rust/itertools/src/combinations_with_replacement.rs b/third_party/rust/itertools/src/combinations_with_replacement.rs index 0fec9671acb..c17e752508f 100644 --- a/third_party/rust/itertools/src/combinations_with_replacement.rs +++ b/third_party/rust/itertools/src/combinations_with_replacement.rs @@ -1,20 +1,23 @@ +use alloc::boxed::Box; use alloc::vec::Vec; use std::fmt; use std::iter::FusedIterator; use super::lazy_buffer::LazyBuffer; +use crate::adaptors::checked_binomial; /// An iterator to iterate through all the `n`-length combinations in an iterator, with replacement. /// /// See [`.combinations_with_replacement()`](crate::Itertools::combinations_with_replacement) /// for more information. #[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct CombinationsWithReplacement where I: Iterator, I::Item: Clone, { - indices: Vec, + indices: Box<[usize]>, pool: LazyBuffer, first: bool, } @@ -24,18 +27,7 @@ where I: Iterator + fmt::Debug, I::Item: fmt::Debug + Clone, { - debug_fmt_fields!(Combinations, indices, pool, first); -} - -impl CombinationsWithReplacement -where - I: Iterator, - I::Item: Clone, -{ - /// Map the current mask over the pool to get an output combination - fn current(&self) -> Vec { - self.indices.iter().map(|i| self.pool[*i].clone()).collect() - } + debug_fmt_fields!(CombinationsWithReplacement, indices, pool, first); } /// Create a new `CombinationsWithReplacement` from a clonable iterator. @@ -44,7 +36,7 @@ where I: Iterator, I::Item: Clone, { - let indices: Vec = alloc::vec![0; k]; + let indices = alloc::vec![0; k].into_boxed_slice(); let pool: LazyBuffer = LazyBuffer::new(iter); CombinationsWithReplacement { @@ -54,51 +46,95 @@ where } } +impl CombinationsWithReplacement +where + I: Iterator, + I::Item: Clone, +{ + /// Increments indices representing the combination to advance to the next + /// (in lexicographic order by increasing sequence) combination. + /// + /// Returns true if we've run out of combinations, false otherwise. + fn increment_indices(&mut self) -> bool { + // Check if we need to consume more from the iterator + // This will run while we increment our first index digit + self.pool.get_next(); + + // Work out where we need to update our indices + let mut increment = None; + for (i, indices_int) in self.indices.iter().enumerate().rev() { + if *indices_int < self.pool.len() - 1 { + increment = Some((i, indices_int + 1)); + break; + } + } + match increment { + // If we can update the indices further + Some((increment_from, increment_value)) => { + // We need to update the rightmost non-max value + // and all those to the right + self.indices[increment_from..].fill(increment_value); + false + } + // Otherwise, we're done + None => true, + } + } +} + impl Iterator for CombinationsWithReplacement where I: Iterator, I::Item: Clone, { type Item = Vec; + fn next(&mut self) -> Option { - // If this is the first iteration, return early if self.first { // In empty edge cases, stop iterating immediately - return if !(self.indices.is_empty() || self.pool.get_next()) { - None - // Otherwise, yield the initial state - } else { - self.first = false; - Some(self.current()) - }; + if !(self.indices.is_empty() || self.pool.get_next()) { + return None; + } + self.first = false; + } else if self.increment_indices() { + return None; } + Some(self.pool.get_at(&self.indices)) + } - // Check if we need to consume more from the iterator - // This will run while we increment our first index digit - self.pool.get_next(); - - // Work out where we need to update our indices - let mut increment: Option<(usize, usize)> = None; - for (i, indices_int) in self.indices.iter().enumerate().rev() { - if *indices_int < self.pool.len()-1 { - increment = Some((i, indices_int + 1)); - break; + fn nth(&mut self, n: usize) -> Option { + if self.first { + // In empty edge cases, stop iterating immediately + if !(self.indices.is_empty() || self.pool.get_next()) { + return None; + } + self.first = false; + } else if self.increment_indices() { + return None; + } + for _ in 0..n { + if self.increment_indices() { + return None; } } + Some(self.pool.get_at(&self.indices)) + } - match increment { - // If we can update the indices further - Some((increment_from, increment_value)) => { - // We need to update the rightmost non-max value - // and all those to the right - for indices_index in increment_from..self.indices.len() { - self.indices[indices_index] = increment_value; - } - Some(self.current()) - } - // Otherwise, we're done - None => None, - } + fn size_hint(&self) -> (usize, Option) { + let (mut low, mut upp) = self.pool.size_hint(); + low = remaining_for(low, self.first, &self.indices).unwrap_or(usize::MAX); + upp = upp.and_then(|upp| remaining_for(upp, self.first, &self.indices)); + (low, upp) + } + + fn count(self) -> usize { + let Self { + indices, + pool, + first, + } = self; + let n = pool.count(); + remaining_for(n, first, &indices).unwrap() } } @@ -106,4 +142,47 @@ impl FusedIterator for CombinationsWithReplacement where I: Iterator, I::Item: Clone, -{} +{ +} + +/// For a given size `n`, return the count of remaining combinations with replacement or None if it would overflow. +fn remaining_for(n: usize, first: bool, indices: &[usize]) -> Option { + // With a "stars and bars" representation, choose k values with replacement from n values is + // like choosing k out of k + n − 1 positions (hence binomial(k + n - 1, k) possibilities) + // to place k stars and therefore n - 1 bars. + // Example (n=4, k=6): ***|*||** represents [0,0,0,1,3,3]. + let count = |n: usize, k: usize| { + let positions = if n == 0 { + k.saturating_sub(1) + } else { + (n - 1).checked_add(k)? + }; + checked_binomial(positions, k) + }; + let k = indices.len(); + if first { + count(n, k) + } else { + // The algorithm is similar to the one for combinations *without replacement*, + // except we choose values *with replacement* and indices are *non-strictly* monotonically sorted. + + // The combinations generated after the current one can be counted by counting as follows: + // - The subsequent combinations that differ in indices[0]: + // If subsequent combinations differ in indices[0], then their value for indices[0] + // must be at least 1 greater than the current indices[0]. + // As indices is monotonically sorted, this means we can effectively choose k values with + // replacement from (n - 1 - indices[0]), leading to count(n - 1 - indices[0], k) possibilities. + // - The subsequent combinations with same indices[0], but differing indices[1]: + // Here we can choose k - 1 values with replacement from (n - 1 - indices[1]) values, + // leading to count(n - 1 - indices[1], k - 1) possibilities. + // - (...) + // - The subsequent combinations with same indices[0..=i], but differing indices[i]: + // Here we can choose k - i values with replacement from (n - 1 - indices[i]) values: count(n - 1 - indices[i], k - i). + // Since subsequent combinations can in any index, we must sum up the aforementioned binomial coefficients. + + // Below, `n0` resembles indices[i]. + indices.iter().enumerate().try_fold(0usize, |sum, (i, n0)| { + sum.checked_add(count(n - 1 - *n0, k - i)?) + }) + } +} diff --git a/third_party/rust/itertools/src/concat_impl.rs b/third_party/rust/itertools/src/concat_impl.rs index f022ec90afb..dc80839ce79 100644 --- a/third_party/rust/itertools/src/concat_impl.rs +++ b/third_party/rust/itertools/src/concat_impl.rs @@ -1,8 +1,6 @@ -use crate::Itertools; - /// Combine all an iterator's elements into one element by using [`Extend`]. /// -/// [`IntoIterator`]-enabled version of [`Itertools::concat`]. +/// [`IntoIterator`]-enabled version of [`Itertools::concat`](crate::Itertools::concat). /// /// This combinator will extend the first item with each of the rest of the /// items of the iterator. If the iterator is empty, the default value of @@ -10,14 +8,20 @@ use crate::Itertools; /// /// ```rust /// use itertools::concat; -/// +/// /// let input = vec![vec![1], vec![2, 3], vec![4, 5, 6]]; /// assert_eq!(concat(input), vec![1, 2, 3, 4, 5, 6]); /// ``` pub fn concat(iterable: I) -> I::Item - where I: IntoIterator, - I::Item: Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default +where + I: IntoIterator, + I::Item: Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default, { - #[allow(deprecated)] //TODO: once msrv hits 1.51. replace `fold1` with `reduce` - iterable.into_iter().fold1(|mut a, b| { a.extend(b); a }).unwrap_or_default() + iterable + .into_iter() + .reduce(|mut a, b| { + a.extend(b); + a + }) + .unwrap_or_default() } diff --git a/third_party/rust/itertools/src/cons_tuples_impl.rs b/third_party/rust/itertools/src/cons_tuples_impl.rs index ae0f48f3493..7e86260b48f 100644 --- a/third_party/rust/itertools/src/cons_tuples_impl.rs +++ b/third_party/rust/itertools/src/cons_tuples_impl.rs @@ -1,3 +1,4 @@ +use crate::adaptors::map::{MapSpecialCase, MapSpecialCaseFn}; macro_rules! impl_cons_iter( ($_A:ident, $_B:ident, ) => (); // stop @@ -5,60 +6,34 @@ macro_rules! impl_cons_iter( ($A:ident, $($B:ident,)*) => ( impl_cons_iter!($($B,)*); #[allow(non_snake_case)] - impl Iterator for ConsTuples - where Iter: Iterator, - { - type Item = ($($B,)* X, ); - fn next(&mut self) -> Option { - self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, )) - } - - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } - fn fold(self, accum: Acc, mut f: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, - { - self.iter.fold(accum, move |acc, (($($B,)*), x)| f(acc, ($($B,)* x, ))) + impl<$($B),*, X> MapSpecialCaseFn<(($($B,)*), X)> for ConsTuplesFn { + type Out = ($($B,)* X, ); + fn call(&mut self, (($($B,)*), X): (($($B,)*), X)) -> Self::Out { + ($($B,)* X, ) } } - - #[allow(non_snake_case)] - impl DoubleEndedIterator for ConsTuples - where Iter: DoubleEndedIterator, - { - fn next_back(&mut self) -> Option { - self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, )) - } - } - ); ); impl_cons_iter!(A, B, C, D, E, F, G, H, I, J, K, L,); +#[derive(Debug, Clone)] +pub struct ConsTuplesFn; + /// An iterator that maps an iterator of tuples like /// `((A, B), C)` to an iterator of `(A, B, C)`. /// /// Used by the `iproduct!()` macro. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct ConsTuples - where I: Iterator, -{ - iter: I, -} - -impl Clone for ConsTuples - where I: Clone + Iterator, -{ - clone_fields!(iter); -} +pub type ConsTuples = MapSpecialCase; /// Create an iterator that maps for example iterators of /// `((A, B), C)` to `(A, B, C)`. -pub fn cons_tuples(iterable: I) -> ConsTuples - where I: IntoIterator +pub fn cons_tuples(iterable: I) -> ConsTuples +where + I: IntoIterator, { - ConsTuples { iter: iterable.into_iter() } + ConsTuples { + iter: iterable.into_iter(), + f: ConsTuplesFn, + } } diff --git a/third_party/rust/itertools/src/diff.rs b/third_party/rust/itertools/src/diff.rs index 1731f0639fc..df88d803286 100644 --- a/third_party/rust/itertools/src/diff.rs +++ b/third_party/rust/itertools/src/diff.rs @@ -1,10 +1,12 @@ //! "Diff"ing iterators for caching elements to sequential collections without requiring the new //! elements' iterator to be `Clone`. //! -//! - [`Diff`] (produced by the [`diff_with`] function) +//! [`Diff`] (produced by the [`diff_with`] function) //! describes the difference between two non-`Clone` iterators `I` and `J` after breaking ASAP from //! a lock-step comparison. +use std::fmt; + use crate::free::put_back; use crate::structs::PutBack; @@ -13,8 +15,9 @@ use crate::structs::PutBack; /// `Diff` represents the way in which the elements yielded by the iterator `I` differ to some /// iterator `J`. pub enum Diff - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { /// The index of the first non-matching element along with both iterator's remaining elements /// starting with the first mis-match. @@ -25,6 +28,43 @@ pub enum Diff Longer(usize, PutBack), } +impl fmt::Debug for Diff +where + I: Iterator, + J: Iterator, + PutBack: fmt::Debug, + PutBack: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::FirstMismatch(idx, i, j) => f + .debug_tuple("FirstMismatch") + .field(idx) + .field(i) + .field(j) + .finish(), + Self::Shorter(idx, i) => f.debug_tuple("Shorter").field(idx).field(i).finish(), + Self::Longer(idx, j) => f.debug_tuple("Longer").field(idx).field(j).finish(), + } + } +} + +impl Clone for Diff +where + I: Iterator, + J: Iterator, + PutBack: Clone, + PutBack: Clone, +{ + fn clone(&self) -> Self { + match self { + Self::FirstMismatch(idx, i, j) => Self::FirstMismatch(*idx, i.clone(), j.clone()), + Self::Shorter(idx, i) => Self::Shorter(*idx, i.clone()), + Self::Longer(idx, j) => Self::Longer(*idx, j.clone()), + } + } +} + /// Compares every element yielded by both `i` and `j` with the given function in lock-step and /// returns a [`Diff`] which describes how `j` differs from `i`. /// @@ -37,11 +77,11 @@ pub enum Diff /// /// If `i` becomes exhausted before `j` becomes exhausted, the number of elements in `i` along with /// the remaining `j` elements will be returned as `Diff::Longer`. -pub fn diff_with(i: I, j: J, is_equal: F) - -> Option> - where I: IntoIterator, - J: IntoIterator, - F: Fn(&I::Item, &J::Item) -> bool +pub fn diff_with(i: I, j: J, mut is_equal: F) -> Option> +where + I: IntoIterator, + J: IntoIterator, + F: FnMut(&I::Item, &J::Item) -> bool, { let mut i = i.into_iter(); let mut j = j.into_iter(); @@ -49,13 +89,16 @@ pub fn diff_with(i: I, j: J, is_equal: F) while let Some(i_elem) = i.next() { match j.next() { None => return Some(Diff::Shorter(idx, put_back(i).with_value(i_elem))), - Some(j_elem) => if !is_equal(&i_elem, &j_elem) { - let remaining_i = put_back(i).with_value(i_elem); - let remaining_j = put_back(j).with_value(j_elem); - return Some(Diff::FirstMismatch(idx, remaining_i, remaining_j)); - }, + Some(j_elem) => { + if !is_equal(&i_elem, &j_elem) { + let remaining_i = put_back(i).with_value(i_elem); + let remaining_j = put_back(j).with_value(j_elem); + return Some(Diff::FirstMismatch(idx, remaining_i, remaining_j)); + } + } } idx += 1; } - j.next().map(|j_elem| Diff::Longer(idx, put_back(j).with_value(j_elem))) + j.next() + .map(|j_elem| Diff::Longer(idx, put_back(j).with_value(j_elem))) } diff --git a/third_party/rust/itertools/src/duplicates_impl.rs b/third_party/rust/itertools/src/duplicates_impl.rs index 28eda44a97f..a0db15432d8 100644 --- a/third_party/rust/itertools/src/duplicates_impl.rs +++ b/third_party/rust/itertools/src/duplicates_impl.rs @@ -2,8 +2,8 @@ use std::hash::Hash; mod private { use std::collections::HashMap; - use std::hash::Hash; use std::fmt; + use std::hash::Hash; #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] @@ -22,7 +22,7 @@ mod private { impl DuplicatesBy { pub(crate) fn new(iter: I, key_method: F) -> Self { - DuplicatesBy { + Self { iter, meta: Meta { used: HashMap::new(), @@ -77,7 +77,7 @@ mod private { type Item = I::Item; fn next(&mut self) -> Option { - let DuplicatesBy { iter, meta } = self; + let Self { iter, meta } = self; iter.find_map(|v| meta.filter(v)) } @@ -109,7 +109,7 @@ mod private { F: KeyMethod, { fn next_back(&mut self) -> Option { - let DuplicatesBy { iter, meta } = self; + let Self { iter, meta } = self; iter.rev().find_map(|v| meta.filter(v)) } } @@ -122,7 +122,7 @@ mod private { } /// Apply the identity function to elements before checking them for equality. - #[derive(Debug)] + #[derive(Debug, Clone)] pub struct ById; impl KeyMethod for ById { type Container = JustValue; @@ -133,6 +133,7 @@ mod private { } /// Apply a user-supplied function to elements before checking them for equality. + #[derive(Clone)] pub struct ByFn(pub(crate) F); impl fmt::Debug for ByFn { debug_fmt_fields!(ByFn,); @@ -213,4 +214,3 @@ where { Duplicates::new(iter, private::ById) } - diff --git a/third_party/rust/itertools/src/either_or_both.rs b/third_party/rust/itertools/src/either_or_both.rs index ef3985f757a..b7a7fc14115 100644 --- a/third_party/rust/itertools/src/either_or_both.rs +++ b/third_party/rust/itertools/src/either_or_both.rs @@ -1,10 +1,12 @@ +use core::ops::{Deref, DerefMut}; + use crate::EitherOrBoth::*; use either::Either; /// Value that either holds a single A or B, or both. #[derive(Clone, PartialEq, Eq, Hash, Debug)] -pub enum EitherOrBoth { +pub enum EitherOrBoth { /// Both values are present. Both(A, B), /// Only the left value of type `A` is present. @@ -14,7 +16,7 @@ pub enum EitherOrBoth { } impl EitherOrBoth { - /// If `Left`, or `Both`, return true, otherwise, return false. + /// If `Left`, or `Both`, return true. Otherwise, return false. pub fn has_left(&self) -> bool { self.as_ref().left().is_some() } @@ -24,31 +26,24 @@ impl EitherOrBoth { self.as_ref().right().is_some() } - /// If Left, return true otherwise, return false. + /// If `Left`, return true. Otherwise, return false. /// Exclusive version of [`has_left`](EitherOrBoth::has_left). pub fn is_left(&self) -> bool { - match *self { - Left(_) => true, - _ => false, - } + matches!(self, Left(_)) } - /// If Right, return true otherwise, return false. + /// If `Right`, return true. Otherwise, return false. /// Exclusive version of [`has_right`](EitherOrBoth::has_right). pub fn is_right(&self) -> bool { - match *self { - Right(_) => true, - _ => false, - } + matches!(self, Right(_)) } - /// If Right, return true otherwise, return false. - /// Equivalent to `self.as_ref().both().is_some()`. + /// If `Both`, return true. Otherwise, return false. pub fn is_both(&self) -> bool { self.as_ref().both().is_some() } - /// If `Left`, or `Both`, return `Some` with the left value, otherwise, return `None`. + /// If `Left`, or `Both`, return `Some` with the left value. Otherwise, return `None`. pub fn left(self) -> Option { match self { Left(left) | Both(left, _) => Some(left), @@ -56,7 +51,7 @@ impl EitherOrBoth { } } - /// If `Right`, or `Both`, return `Some` with the right value, otherwise, return `None`. + /// If `Right`, or `Both`, return `Some` with the right value. Otherwise, return `None`. pub fn right(self) -> Option { match self { Right(right) | Both(_, right) => Some(right), @@ -64,7 +59,65 @@ impl EitherOrBoth { } } - /// If Both, return `Some` tuple containing left and right. + /// Return tuple of options corresponding to the left and right value respectively + /// + /// If `Left` return `(Some(..), None)`, if `Right` return `(None,Some(..))`, else return + /// `(Some(..),Some(..))` + pub fn left_and_right(self) -> (Option, Option) { + self.map_any(Some, Some).or_default() + } + + /// If `Left`, return `Some` with the left value. If `Right` or `Both`, return `None`. + /// + /// # Examples + /// + /// ``` + /// // On the `Left` variant. + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Right, Both}}; + /// let x: EitherOrBoth<_, ()> = Left("bonjour"); + /// assert_eq!(x.just_left(), Some("bonjour")); + /// + /// // On the `Right` variant. + /// let x: EitherOrBoth<(), _> = Right("hola"); + /// assert_eq!(x.just_left(), None); + /// + /// // On the `Both` variant. + /// let x = Both("bonjour", "hola"); + /// assert_eq!(x.just_left(), None); + /// ``` + pub fn just_left(self) -> Option { + match self { + Left(left) => Some(left), + _ => None, + } + } + + /// If `Right`, return `Some` with the right value. If `Left` or `Both`, return `None`. + /// + /// # Examples + /// + /// ``` + /// // On the `Left` variant. + /// # use itertools::{EitherOrBoth::{Left, Right, Both}, EitherOrBoth}; + /// let x: EitherOrBoth<_, ()> = Left("auf wiedersehen"); + /// assert_eq!(x.just_left(), Some("auf wiedersehen")); + /// + /// // On the `Right` variant. + /// let x: EitherOrBoth<(), _> = Right("adios"); + /// assert_eq!(x.just_left(), None); + /// + /// // On the `Both` variant. + /// let x = Both("auf wiedersehen", "adios"); + /// assert_eq!(x.just_left(), None); + /// ``` + pub fn just_right(self) -> Option { + match self { + Right(right) => Some(right), + _ => None, + } + } + + /// If `Both`, return `Some` containing the left and right values. Otherwise, return `None`. pub fn both(self) -> Option<(A, B)> { match self { Both(a, b) => Some((a, b)), @@ -72,6 +125,28 @@ impl EitherOrBoth { } } + /// If `Left` or `Both`, return the left value. Otherwise, convert the right value and return it. + pub fn into_left(self) -> A + where + B: Into, + { + match self { + Left(a) | Both(a, _) => a, + Right(b) => b.into(), + } + } + + /// If `Right` or `Both`, return the right value. Otherwise, convert the left value and return it. + pub fn into_right(self) -> B + where + A: Into, + { + match self { + Right(b) | Both(_, b) => b, + Left(a) => a.into(), + } + } + /// Converts from `&EitherOrBoth` to `EitherOrBoth<&A, &B>`. pub fn as_ref(&self) -> EitherOrBoth<&A, &B> { match *self { @@ -90,6 +165,32 @@ impl EitherOrBoth { } } + /// Converts from `&EitherOrBoth` to `EitherOrBoth<&_, &_>` using the [`Deref`] trait. + pub fn as_deref(&self) -> EitherOrBoth<&A::Target, &B::Target> + where + A: Deref, + B: Deref, + { + match *self { + Left(ref left) => Left(left), + Right(ref right) => Right(right), + Both(ref left, ref right) => Both(left, right), + } + } + + /// Converts from `&mut EitherOrBoth` to `EitherOrBoth<&mut _, &mut _>` using the [`DerefMut`] trait. + pub fn as_deref_mut(&mut self) -> EitherOrBoth<&mut A::Target, &mut B::Target> + where + A: DerefMut, + B: DerefMut, + { + match *self { + Left(ref mut left) => Left(left), + Right(ref mut right) => Right(right), + Both(ref mut left, ref mut right) => Both(left, right), + } + } + /// Convert `EitherOrBoth` to `EitherOrBoth`. pub fn flip(self) -> EitherOrBoth { match self { @@ -200,9 +301,9 @@ impl EitherOrBoth { B: Default, { match self { - EitherOrBoth::Left(l) => (l, B::default()), - EitherOrBoth::Right(r) => (A::default(), r), - EitherOrBoth::Both(l, r) => (l, r), + Left(l) => (l, B::default()), + Right(r) => (A::default(), r), + Both(l, r) => (l, r), } } @@ -227,10 +328,160 @@ impl EitherOrBoth { Both(inner_l, inner_r) => (inner_l, inner_r), } } + + /// Returns a mutable reference to the left value. If the left value is not present, + /// it is replaced with `val`. + pub fn left_or_insert(&mut self, val: A) -> &mut A { + self.left_or_insert_with(|| val) + } + + /// Returns a mutable reference to the right value. If the right value is not present, + /// it is replaced with `val`. + pub fn right_or_insert(&mut self, val: B) -> &mut B { + self.right_or_insert_with(|| val) + } + + /// If the left value is not present, replace it the value computed by the closure `f`. + /// Returns a mutable reference to the now-present left value. + pub fn left_or_insert_with(&mut self, f: F) -> &mut A + where + F: FnOnce() -> A, + { + match self { + Left(left) | Both(left, _) => left, + Right(_) => self.insert_left(f()), + } + } + + /// If the right value is not present, replace it the value computed by the closure `f`. + /// Returns a mutable reference to the now-present right value. + pub fn right_or_insert_with(&mut self, f: F) -> &mut B + where + F: FnOnce() -> B, + { + match self { + Right(right) | Both(_, right) => right, + Left(_) => self.insert_right(f()), + } + } + + /// Sets the `left` value of this instance, and returns a mutable reference to it. + /// Does not affect the `right` value. + /// + /// # Examples + /// ``` + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Right, Both}}; + /// + /// // Overwriting a pre-existing value. + /// let mut either: EitherOrBoth<_, ()> = Left(0_u32); + /// assert_eq!(*either.insert_left(69), 69); + /// + /// // Inserting a second value. + /// let mut either = Right("no"); + /// assert_eq!(*either.insert_left("yes"), "yes"); + /// assert_eq!(either, Both("yes", "no")); + /// ``` + pub fn insert_left(&mut self, val: A) -> &mut A { + match self { + Left(left) | Both(left, _) => { + *left = val; + left + } + Right(right) => { + // This is like a map in place operation. We move out of the reference, + // change the value, and then move back into the reference. + unsafe { + // SAFETY: We know this pointer is valid for reading since we got it from a reference. + let right = std::ptr::read(right as *mut _); + // SAFETY: Again, we know the pointer is valid since we got it from a reference. + std::ptr::write(self as *mut _, Both(val, right)); + } + + if let Both(left, _) = self { + left + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } + } + } + + /// Sets the `right` value of this instance, and returns a mutable reference to it. + /// Does not affect the `left` value. + /// + /// # Examples + /// ``` + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Both}}; + /// // Overwriting a pre-existing value. + /// let mut either: EitherOrBoth<_, ()> = Left(0_u32); + /// assert_eq!(*either.insert_left(69), 69); + /// + /// // Inserting a second value. + /// let mut either = Left("what's"); + /// assert_eq!(*either.insert_right(9 + 10), 21 - 2); + /// assert_eq!(either, Both("what's", 9+10)); + /// ``` + pub fn insert_right(&mut self, val: B) -> &mut B { + match self { + Right(right) | Both(_, right) => { + *right = val; + right + } + Left(left) => { + // This is like a map in place operation. We move out of the reference, + // change the value, and then move back into the reference. + unsafe { + // SAFETY: We know this pointer is valid for reading since we got it from a reference. + let left = std::ptr::read(left as *mut _); + // SAFETY: Again, we know the pointer is valid since we got it from a reference. + std::ptr::write(self as *mut _, Both(left, val)); + } + if let Both(_, right) = self { + right + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } + } + } + + /// Set `self` to `Both(..)`, containing the specified left and right values, + /// and returns a mutable reference to those values. + pub fn insert_both(&mut self, left: A, right: B) -> (&mut A, &mut B) { + *self = Both(left, right); + if let Both(left, right) = self { + (left, right) + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } } impl EitherOrBoth { - /// Return either value of left, right, or the product of `f` applied where `Both` are present. + /// Return either value of left, right, or apply a function `f` to both values if both are present. + /// The input function has to return the same type as both Right and Left carry. + /// + /// This function can be used to preferrably extract the left resp. right value, + /// but fall back to the other (i.e. right resp. left) if the preferred one is not present. + /// + /// # Examples + /// ``` + /// # use itertools::EitherOrBoth; + /// assert_eq!(EitherOrBoth::Both(3, 7).reduce(u32::max), 7); + /// assert_eq!(EitherOrBoth::Left(3).reduce(u32::max), 3); + /// assert_eq!(EitherOrBoth::Right(7).reduce(u32::max), 7); + /// + /// // Extract the left value if present, fall back to the right otherwise. + /// assert_eq!(EitherOrBoth::Left("left").reduce(|l, _r| l), "left"); + /// assert_eq!(EitherOrBoth::Right("right").reduce(|l, _r| l), "right"); + /// assert_eq!(EitherOrBoth::Both("left", "right").reduce(|l, _r| l), "left"); + /// ``` pub fn reduce(self, f: F) -> T where F: FnOnce(T, T) -> T, @@ -243,12 +494,21 @@ impl EitherOrBoth { } } -impl Into>> for EitherOrBoth { - fn into(self) -> Option> { - match self { - EitherOrBoth::Left(l) => Some(Either::Left(l)), - EitherOrBoth::Right(r) => Some(Either::Right(r)), - _ => None, +impl From> for Option> { + fn from(value: EitherOrBoth) -> Self { + match value { + Left(l) => Some(Either::Left(l)), + Right(r) => Some(Either::Right(r)), + Both(..) => None, + } + } +} + +impl From> for EitherOrBoth { + fn from(either: Either) -> Self { + match either { + Either::Left(l) => Left(l), + Either::Right(l) => Right(l), } } } diff --git a/third_party/rust/itertools/src/exactly_one_err.rs b/third_party/rust/itertools/src/exactly_one_err.rs index c54ae77ca92..19b9e19189a 100644 --- a/third_party/rust/itertools/src/exactly_one_err.rs +++ b/third_party/rust/itertools/src/exactly_one_err.rs @@ -8,7 +8,7 @@ use either::Either; use crate::size_hint; -/// Iterator returned for the error case of `IterTools::exactly_one()` +/// Iterator returned for the error case of `Itertools::exactly_one()` /// This iterator yields exactly the same elements as the input iterator. /// /// During the execution of `exactly_one` the iterator must be mutated. This wrapper @@ -54,26 +54,37 @@ where Some(Either::Left([first, second])) => { self.first_two = Some(Either::Right(second)); Some(first) - }, - Some(Either::Right(second)) => { - Some(second) - } - None => { - self.inner.next() } + Some(Either::Right(second)) => Some(second), + None => self.inner.next(), } } fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.inner.size_hint(), self.additional_len()) } -} + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + match self.first_two { + Some(Either::Left([first, second])) => { + init = f(init, first); + init = f(init, second); + } + Some(Either::Right(second)) => init = f(init, second), + None => {} + } + self.inner.fold(init, f) + } +} impl ExactSizeIterator for ExactlyOneError where I: ExactSizeIterator {} -impl Display for ExactlyOneError - where I: Iterator, +impl Display for ExactlyOneError +where + I: Iterator, { fn fmt(&self, f: &mut Formatter) -> FmtResult { let additional = self.additional_len(); @@ -85,26 +96,30 @@ impl Display for ExactlyOneError } } -impl Debug for ExactlyOneError - where I: Iterator + Debug, - I::Item: Debug, +impl Debug for ExactlyOneError +where + I: Iterator + Debug, + I::Item: Debug, { fn fmt(&self, f: &mut Formatter) -> FmtResult { + let mut dbg = f.debug_struct("ExactlyOneError"); match &self.first_two { Some(Either::Left([first, second])) => { - write!(f, "ExactlyOneError[First: {:?}, Second: {:?}, RemainingIter: {:?}]", first, second, self.inner) - }, + dbg.field("first", first).field("second", second); + } Some(Either::Right(second)) => { - write!(f, "ExactlyOneError[Second: {:?}, RemainingIter: {:?}]", second, self.inner) - } - None => { - write!(f, "ExactlyOneError[RemainingIter: {:?}]", self.inner) + dbg.field("second", second); } + None => {} } + dbg.field("inner", &self.inner).finish() } } #[cfg(feature = "use_std")] -impl Error for ExactlyOneError where I: Iterator + Debug, I::Item: Debug, {} - - +impl Error for ExactlyOneError +where + I: Iterator + Debug, + I::Item: Debug, +{ +} diff --git a/third_party/rust/itertools/src/extrema_set.rs b/third_party/rust/itertools/src/extrema_set.rs index ae128364c5d..7d353821f36 100644 --- a/third_party/rust/itertools/src/extrema_set.rs +++ b/third_party/rust/itertools/src/extrema_set.rs @@ -1,3 +1,4 @@ +use alloc::{vec, vec::Vec}; use std::cmp::Ordering; /// Implementation guts for `min_set`, `min_set_by`, and `min_set_by_key`. diff --git a/third_party/rust/itertools/src/flatten_ok.rs b/third_party/rust/itertools/src/flatten_ok.rs index 21ae1f72236..48f1e90a647 100644 --- a/third_party/rust/itertools/src/flatten_ok.rs +++ b/third_party/rust/itertools/src/flatten_ok.rs @@ -72,6 +72,29 @@ where } } + fn fold(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + // Front + let mut acc = match self.inner_front { + Some(x) => x.fold(init, |a, o| f(a, Ok(o))), + None => init, + }; + + acc = self.iter.fold(acc, |acc, x| match x { + Ok(it) => it.into_iter().fold(acc, |a, o| f(a, Ok(o))), + Err(e) => f(acc, Err(e)), + }); + + // Back + match self.inner_back { + Some(x) => x.fold(acc, |a, o| f(a, Ok(o))), + None => acc, + } + } + fn size_hint(&self) -> (usize, Option) { let inner_hint = |inner: &Option| { inner @@ -130,6 +153,29 @@ where } } } + + fn rfold(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + // Back + let mut acc = match self.inner_back { + Some(x) => x.rfold(init, |a, o| f(a, Ok(o))), + None => init, + }; + + acc = self.iter.rfold(acc, |acc, x| match x { + Ok(it) => it.into_iter().rfold(acc, |a, o| f(a, Ok(o))), + Err(e) => f(acc, Err(e)), + }); + + // Front + match self.inner_front { + Some(x) => x.rfold(acc, |a, o| f(a, Ok(o))), + None => acc, + } + } } impl Clone for FlattenOk @@ -147,13 +193,7 @@ where T: IntoIterator, T::IntoIter: fmt::Debug, { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("FlattenOk") - .field("iter", &self.iter) - .field("inner_front", &self.inner_front) - .field("inner_back", &self.inner_back) - .finish() - } + debug_fmt_fields!(FlattenOk, iter, inner_front, inner_back); } /// Only the iterator being flattened needs to implement [`FusedIterator`]. diff --git a/third_party/rust/itertools/src/format.rs b/third_party/rust/itertools/src/format.rs index d87cee95035..3abdda369c9 100644 --- a/third_party/rust/itertools/src/format.rs +++ b/third_party/rust/itertools/src/format.rs @@ -1,5 +1,5 @@ +use std::cell::Cell; use std::fmt; -use std::cell::RefCell; /// Format all iterator elements lazily, separated by `sep`. /// @@ -7,11 +7,10 @@ use std::cell::RefCell; /// exhausted. /// /// See [`.format_with()`](crate::Itertools::format_with) for more information. -#[derive(Clone)] pub struct FormatWith<'a, I, F> { sep: &'a str, - /// FormatWith uses interior mutability because Display::fmt takes &self. - inner: RefCell>, + /// `FormatWith` uses interior mutability because `Display::fmt` takes `&self`. + inner: Cell>, } /// Format all iterator elements lazily, separated by `sep`. @@ -21,38 +20,40 @@ pub struct FormatWith<'a, I, F> { /// /// See [`.format()`](crate::Itertools::format) /// for more information. -#[derive(Clone)] pub struct Format<'a, I> { sep: &'a str, - /// Format uses interior mutability because Display::fmt takes &self. - inner: RefCell>, + /// `Format` uses interior mutability because `Display::fmt` takes `&self`. + inner: Cell>, } pub fn new_format(iter: I, separator: &str, f: F) -> FormatWith<'_, I, F> - where I: Iterator, - F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result +where + I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { FormatWith { sep: separator, - inner: RefCell::new(Some((iter, f))), + inner: Cell::new(Some((iter, f))), } } pub fn new_format_default(iter: I, separator: &str) -> Format<'_, I> - where I: Iterator, +where + I: Iterator, { Format { sep: separator, - inner: RefCell::new(Some(iter)), + inner: Cell::new(Some(iter)), } } -impl<'a, I, F> fmt::Display for FormatWith<'a, I, F> - where I: Iterator, - F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result +impl fmt::Display for FormatWith<'_, I, F> +where + I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let (mut iter, mut format) = match self.inner.borrow_mut().take() { + let (mut iter, mut format) = match self.inner.take() { Some(t) => t, None => panic!("FormatWith: was already formatted once"), }; @@ -70,13 +71,26 @@ impl<'a, I, F> fmt::Display for FormatWith<'a, I, F> } } -impl<'a, I> Format<'a, I> - where I: Iterator, +impl fmt::Debug for FormatWith<'_, I, F> +where + I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { - fn format(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result - where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result, - { - let mut iter = match self.inner.borrow_mut().take() { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self, f) + } +} + +impl Format<'_, I> +where + I: Iterator, +{ + fn format( + &self, + f: &mut fmt::Formatter, + cb: fn(&I::Item, &mut fmt::Formatter) -> fmt::Result, + ) -> fmt::Result { + let mut iter = match self.inner.take() { Some(t) => t, None => panic!("Format: was already formatted once"), }; @@ -109,5 +123,56 @@ macro_rules! impl_format { } } -impl_format!{Display Debug - UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer} +impl_format! {Display Debug UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer} + +impl Clone for FormatWith<'_, I, F> +where + (I, F): Clone, +{ + fn clone(&self) -> Self { + struct PutBackOnDrop<'r, 'a, I, F> { + into: &'r FormatWith<'a, I, F>, + inner: Option<(I, F)>, + } + // This ensures we preserve the state of the original `FormatWith` if `Clone` panics + impl Drop for PutBackOnDrop<'_, '_, I, F> { + fn drop(&mut self) { + self.into.inner.set(self.inner.take()) + } + } + let pbod = PutBackOnDrop { + inner: self.inner.take(), + into: self, + }; + Self { + inner: Cell::new(pbod.inner.clone()), + sep: self.sep, + } + } +} + +impl Clone for Format<'_, I> +where + I: Clone, +{ + fn clone(&self) -> Self { + struct PutBackOnDrop<'r, 'a, I> { + into: &'r Format<'a, I>, + inner: Option, + } + // This ensures we preserve the state of the original `FormatWith` if `Clone` panics + impl Drop for PutBackOnDrop<'_, '_, I> { + fn drop(&mut self) { + self.into.inner.set(self.inner.take()) + } + } + let pbod = PutBackOnDrop { + inner: self.inner.take(), + into: self, + }; + Self { + inner: Cell::new(pbod.inner.clone()), + sep: self.sep, + } + } +} diff --git a/third_party/rust/itertools/src/free.rs b/third_party/rust/itertools/src/free.rs index 19e3e28694d..4c6820543ca 100644 --- a/third_party/rust/itertools/src/free.rs +++ b/third_party/rust/itertools/src/free.rs @@ -10,30 +10,24 @@ use std::iter::{self, Zip}; type VecIntoIter = alloc::vec::IntoIter; #[cfg(feature = "use_alloc")] -use alloc::{ - string::String, -}; +use alloc::string::String; -use crate::Itertools; use crate::intersperse::{Intersperse, IntersperseWith}; +use crate::Itertools; -pub use crate::adaptors::{ - interleave, - merge, - put_back, -}; +pub use crate::adaptors::{interleave, put_back}; #[cfg(feature = "use_alloc")] -pub use crate::put_back_n_impl::put_back_n; +pub use crate::kmerge_impl::kmerge; +pub use crate::merge_join::{merge, merge_join_by}; #[cfg(feature = "use_alloc")] pub use crate::multipeek_impl::multipeek; #[cfg(feature = "use_alloc")] pub use crate::peek_nth::peek_nth; #[cfg(feature = "use_alloc")] -pub use crate::kmerge_impl::kmerge; -pub use crate::zip_eq_impl::zip_eq; -pub use crate::merge_join::merge_join_by; +pub use crate::put_back_n_impl::put_back_n; #[cfg(feature = "use_alloc")] pub use crate::rciter_impl::rciter; +pub use crate::zip_eq_impl::zip_eq; /// Iterate `iterable` with a particular value inserted between each element. /// @@ -42,11 +36,12 @@ pub use crate::rciter_impl::rciter; /// ``` /// use itertools::intersperse; /// -/// itertools::assert_equal(intersperse((0..3), 8), vec![0, 8, 1, 8, 2]); +/// itertools::assert_equal(intersperse(0..3, 8), vec![0, 8, 1, 8, 2]); /// ``` pub fn intersperse(iterable: I, element: I::Item) -> Intersperse - where I: IntoIterator, - ::Item: Clone +where + I: IntoIterator, + ::Item: Clone, { Itertools::intersperse(iterable.into_iter(), element) } @@ -60,12 +55,13 @@ pub fn intersperse(iterable: I, element: I::Item) -> Intersperse /// use itertools::intersperse_with; /// /// let mut i = 10; -/// itertools::assert_equal(intersperse_with((0..3), || { i -= 1; i }), vec![0, 9, 1, 8, 2]); +/// itertools::assert_equal(intersperse_with(0..3, || { i -= 1; i }), vec![0, 9, 1, 8, 2]); /// assert_eq!(i, 8); /// ``` pub fn intersperse_with(iterable: I, element: F) -> IntersperseWith - where I: IntoIterator, - F: FnMut() -> I::Item +where + I: IntoIterator, + F: FnMut() -> I::Item, { Itertools::intersperse_with(iterable.into_iter(), element) } @@ -79,10 +75,12 @@ pub fn intersperse_with(iterable: I, element: F) -> IntersperseWith(iterable: I) -> iter::Enumerate - where I: IntoIterator +where + I: IntoIterator, { iterable.into_iter().enumerate() } @@ -96,11 +94,13 @@ pub fn enumerate(iterable: I) -> iter::Enumerate /// /// for elt in rev(&[1, 2, 3]) { /// /* loop body */ +/// # let _ = elt; /// } /// ``` pub fn rev(iterable: I) -> iter::Rev - where I: IntoIterator, - I::IntoIter: DoubleEndedIterator +where + I: IntoIterator, + I::IntoIter: DoubleEndedIterator, { iterable.into_iter().rev() } @@ -108,7 +108,7 @@ pub fn rev(iterable: I) -> iter::Rev /// Converts the arguments to iterators and zips them. /// /// [`IntoIterator`] enabled version of [`Iterator::zip`]. -/// +/// /// ## Example /// /// ``` @@ -121,23 +121,26 @@ pub fn rev(iterable: I) -> iter::Rev /// } /// assert_eq!(result, vec![(1, 'a'),(2, 'b'),(3, 'c')]); /// ``` -#[deprecated(note="Use [std::iter::zip](https://doc.rust-lang.org/std/iter/fn.zip.html) instead", since="0.10.4")] +#[deprecated( + note = "Use [std::iter::zip](https://doc.rust-lang.org/std/iter/fn.zip.html) instead", + since = "0.10.4" +)] pub fn zip(i: I, j: J) -> Zip - where I: IntoIterator, - J: IntoIterator +where + I: IntoIterator, + J: IntoIterator, { i.into_iter().zip(j) } - -/// Takes two iterables and creates a new iterator over both in sequence. +/// Takes two iterables and creates a new iterator over both in sequence. /// /// [`IntoIterator`] enabled version of [`Iterator::chain`]. /// /// ## Example /// ``` /// use itertools::chain; -/// +/// /// let mut result:Vec = Vec::new(); /// /// for element in chain(&[1, 2, 3], &[4]) { @@ -145,14 +148,18 @@ pub fn zip(i: I, j: J) -> Zip /// } /// assert_eq!(result, vec![1, 2, 3, 4]); /// ``` -pub fn chain(i: I, j: J) -> iter::Chain<::IntoIter, ::IntoIter> - where I: IntoIterator, - J: IntoIterator +pub fn chain( + i: I, + j: J, +) -> iter::Chain<::IntoIter, ::IntoIter> +where + I: IntoIterator, + J: IntoIterator, { i.into_iter().chain(j) } -/// Create an iterator that clones each element from &T to T +/// Create an iterator that clones each element from `&T` to `T`. /// /// [`IntoIterator`] enabled version of [`Iterator::cloned`]. /// @@ -161,9 +168,10 @@ pub fn chain(i: I, j: J) -> iter::Chain<::IntoIter, (iterable: I) -> iter::Cloned - where I: IntoIterator, - T: Clone, +pub fn cloned<'a, I, T>(iterable: I) -> iter::Cloned +where + I: IntoIterator, + T: Clone + 'a, { iterable.into_iter().cloned() } @@ -178,8 +186,9 @@ pub fn cloned<'a, I, T: 'a>(iterable: I) -> iter::Cloned /// assert_eq!(fold(&[1., 2., 3.], 0., |a, &b| f32::max(a, b)), 3.); /// ``` pub fn fold(iterable: I, init: B, f: F) -> B - where I: IntoIterator, - F: FnMut(B, I::Item) -> B +where + I: IntoIterator, + F: FnMut(B, I::Item) -> B, { iterable.into_iter().fold(init, f) } @@ -194,8 +203,9 @@ pub fn fold(iterable: I, init: B, f: F) -> B /// assert!(all(&[1, 2, 3], |elt| *elt > 0)); /// ``` pub fn all(iterable: I, f: F) -> bool - where I: IntoIterator, - F: FnMut(I::Item) -> bool +where + I: IntoIterator, + F: FnMut(I::Item) -> bool, { iterable.into_iter().all(f) } @@ -210,8 +220,9 @@ pub fn all(iterable: I, f: F) -> bool /// assert!(any(&[0, -1, 2], |elt| *elt > 0)); /// ``` pub fn any(iterable: I, f: F) -> bool - where I: IntoIterator, - F: FnMut(I::Item) -> bool +where + I: IntoIterator, + F: FnMut(I::Item) -> bool, { iterable.into_iter().any(f) } @@ -226,8 +237,9 @@ pub fn any(iterable: I, f: F) -> bool /// assert_eq!(max(0..10), Some(9)); /// ``` pub fn max(iterable: I) -> Option - where I: IntoIterator, - I::Item: Ord +where + I: IntoIterator, + I::Item: Ord, { iterable.into_iter().max() } @@ -242,14 +254,14 @@ pub fn max(iterable: I) -> Option /// assert_eq!(min(0..10), Some(0)); /// ``` pub fn min(iterable: I) -> Option - where I: IntoIterator, - I::Item: Ord +where + I: IntoIterator, + I::Item: Ord, { iterable.into_iter().min() } - -/// Combine all iterator elements into one String, separated by `sep`. +/// Combine all iterator elements into one `String`, separated by `sep`. /// /// [`IntoIterator`] enabled version of [`Itertools::join`]. /// @@ -260,8 +272,9 @@ pub fn min(iterable: I) -> Option /// ``` #[cfg(feature = "use_alloc")] pub fn join(iterable: I, sep: &str) -> String - where I: IntoIterator, - I::Item: Display +where + I: IntoIterator, + I::Item: Display, { iterable.into_iter().join(sep) } @@ -278,9 +291,29 @@ pub fn join(iterable: I, sep: &str) -> String /// ``` #[cfg(feature = "use_alloc")] pub fn sorted(iterable: I) -> VecIntoIter - where I: IntoIterator, - I::Item: Ord +where + I: IntoIterator, + I::Item: Ord, { iterable.into_iter().sorted() } +/// Sort all iterator elements into a new iterator in ascending order. +/// This sort is unstable (i.e., may reorder equal elements). +/// +/// [`IntoIterator`] enabled version of [`Itertools::sorted_unstable`]. +/// +/// ``` +/// use itertools::sorted_unstable; +/// use itertools::assert_equal; +/// +/// assert_equal(sorted_unstable("rust".chars()), "rstu".chars()); +/// ``` +#[cfg(feature = "use_alloc")] +pub fn sorted_unstable(iterable: I) -> VecIntoIter +where + I: IntoIterator, + I::Item: Ord, +{ + iterable.into_iter().sorted_unstable() +} diff --git a/third_party/rust/itertools/src/group_map.rs b/third_party/rust/itertools/src/group_map.rs index a2d0ebb2aba..3dcee83afd0 100644 --- a/third_party/rust/itertools/src/group_map.rs +++ b/third_party/rust/itertools/src/group_map.rs @@ -9,8 +9,9 @@ use std::iter::Iterator; /// See [`.into_group_map()`](crate::Itertools::into_group_map) /// for more information. pub fn into_group_map(iter: I) -> HashMap> - where I: Iterator, - K: Hash + Eq, +where + I: Iterator, + K: Hash + Eq, { let mut lookup = HashMap::new(); @@ -21,12 +22,11 @@ pub fn into_group_map(iter: I) -> HashMap> lookup } -pub fn into_group_map_by(iter: I, f: impl Fn(&V) -> K) -> HashMap> - where - I: Iterator, - K: Hash + Eq, +pub fn into_group_map_by(iter: I, mut f: F) -> HashMap> +where + I: Iterator, + K: Hash + Eq, + F: FnMut(&V) -> K, { - into_group_map( - iter.map(|v| (f(&v), v)) - ) + into_group_map(iter.map(|v| (f(&v), v))) } diff --git a/third_party/rust/itertools/src/groupbylazy.rs b/third_party/rust/itertools/src/groupbylazy.rs index a5a321df453..5847c8f7d1f 100644 --- a/third_party/rust/itertools/src/groupbylazy.rs +++ b/third_party/rust/itertools/src/groupbylazy.rs @@ -1,14 +1,15 @@ -use std::cell::{Cell, RefCell}; use alloc::vec::{self, Vec}; +use std::cell::{Cell, RefCell}; -/// A trait to unify `FnMut` for `GroupBy` with the chunk key in `IntoChunks` +/// A trait to unify `FnMut` for `ChunkBy` with the chunk key in `IntoChunks` trait KeyFunction { type Key; fn call_mut(&mut self, arg: A) -> Self::Key; } -impl KeyFunction for F - where F: FnMut(A) -> K +impl KeyFunction for F +where + F: FnMut(A) -> K + ?Sized, { type Key = K; #[inline] @@ -17,9 +18,8 @@ impl KeyFunction for F } } - /// `ChunkIndex` acts like the grouping key function for `IntoChunks` -#[derive(Debug)] +#[derive(Debug, Clone)] struct ChunkIndex { size: usize, index: usize, @@ -29,7 +29,7 @@ struct ChunkIndex { impl ChunkIndex { #[inline(always)] fn new(size: usize) -> Self { - ChunkIndex { + Self { size, index: 0, key: 0, @@ -50,9 +50,10 @@ impl KeyFunction for ChunkIndex { } } - +#[derive(Clone)] struct GroupInner - where I: Iterator +where + I: Iterator, { key: F, iter: I, @@ -65,19 +66,21 @@ struct GroupInner /// Least index for which we still have elements buffered oldest_buffered_group: usize, /// Group index for `buffer[0]` -- the slots - /// bottom_group..oldest_buffered_group are unused and will be erased when + /// `bottom_group..oldest_buffered_group` are unused and will be erased when /// that range is large enough. bottom_group: usize, /// Buffered groups, from `bottom_group` (index 0) to `top_group`. buffer: Vec>, - /// index of last group iter that was dropped, usize::MAX == none + /// index of last group iter that was dropped, + /// `usize::MAX` initially when no group was dropped dropped_group: usize, } impl GroupInner - where I: Iterator, - F: for<'a> KeyFunction<&'a I::Item, Key=K>, - K: PartialEq, +where + I: Iterator, + F: for<'a> KeyFunction<&'a I::Item, Key = K>, + K: PartialEq, { /// `client`: Index of group that requests next element #[inline(always)] @@ -90,9 +93,8 @@ impl GroupInner */ if client < self.oldest_buffered_group { None - } else if client < self.top_group || - (client == self.top_group && - self.buffer.len() > self.top_group - self.bottom_group) + } else if client < self.top_group + || (client == self.top_group && self.buffer.len() > self.top_group - self.bottom_group) { self.lookup_buffer(client) } else if self.done { @@ -118,8 +120,10 @@ impl GroupInner // `bottom_group..oldest_buffered_group` is unused, and if it's large enough, erase it. self.oldest_buffered_group += 1; // skip forward further empty queues too - while self.buffer.get(self.oldest_buffered_group - self.bottom_group) - .map_or(false, |buf| buf.len() == 0) + while self + .buffer + .get(self.oldest_buffered_group - self.bottom_group) + .map_or(false, |buf| buf.len() == 0) { self.oldest_buffered_group += 1; } @@ -144,12 +148,14 @@ impl GroupInner fn next_element(&mut self) -> Option { debug_assert!(!self.done); match self.iter.next() { - None => { self.done = true; None } + None => { + self.done = true; + None + } otherwise => otherwise, } } - #[inline(never)] fn step_buffering(&mut self, client: usize) -> Option { // requested a later group -- walk through the current group up to @@ -171,11 +177,13 @@ impl GroupInner let key = self.key.call_mut(&elt); match self.current_key.take() { None => {} - Some(old_key) => if old_key != key { - self.current_key = Some(key); - first_elt = Some(elt); - break; - }, + Some(old_key) => { + if old_key != key { + self.current_key = Some(key); + first_elt = Some(elt); + break; + } + } } self.current_key = Some(key); if self.top_group != self.dropped_group { @@ -220,12 +228,14 @@ impl GroupInner let key = self.key.call_mut(&elt); match self.current_key.take() { None => {} - Some(old_key) => if old_key != key { - self.current_key = Some(key); - self.current_elt = Some(elt); - self.top_group += 1; - return None; - }, + Some(old_key) => { + if old_key != key { + self.current_key = Some(key); + self.current_elt = Some(elt); + self.top_group += 1; + return None; + } + } } self.current_key = Some(key); Some(elt) @@ -261,7 +271,8 @@ impl GroupInner } impl GroupInner - where I: Iterator, +where + I: Iterator, { /// Called when a group is dropped fn drop_group(&mut self, client: usize) { @@ -272,10 +283,14 @@ impl GroupInner } } -/// `GroupBy` is the storage for the lazy grouping operation. +#[deprecated(note = "Use `ChunkBy` instead", since = "0.13.0")] +/// See [`ChunkBy`](crate::structs::ChunkBy). +pub type GroupBy = ChunkBy; + +/// `ChunkBy` is the storage for the lazy grouping operation. /// /// If the groups are consumed in their original order, or if each -/// group is dropped without keeping it around, then `GroupBy` uses +/// group is dropped without keeping it around, then `ChunkBy` uses /// no allocations. It needs allocations only if several group iterators /// are alive at the same time. /// @@ -284,10 +299,11 @@ impl GroupInner /// value. It should be stored in a local variable or temporary and /// iterated. /// -/// See [`.group_by()`](crate::Itertools::group_by) for more information. +/// See [`.chunk_by()`](crate::Itertools::chunk_by) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct GroupBy - where I: Iterator, +pub struct ChunkBy +where + I: Iterator, { inner: RefCell>, // the group iterator's current index. Keep this in the main value @@ -296,11 +312,12 @@ pub struct GroupBy } /// Create a new -pub fn new(iter: J, f: F) -> GroupBy - where J: IntoIterator, - F: FnMut(&J::Item) -> K, +pub fn new(iter: J, f: F) -> ChunkBy +where + J: IntoIterator, + F: FnMut(&J::Item) -> K, { - GroupBy { + ChunkBy { inner: RefCell::new(GroupInner { key: f, iter: iter.into_iter(), @@ -317,13 +334,15 @@ pub fn new(iter: J, f: F) -> GroupBy } } -impl GroupBy - where I: Iterator, +impl ChunkBy +where + I: Iterator, { /// `client`: Index of group that requests next element fn step(&self, client: usize) -> Option - where F: FnMut(&I::Item) -> K, - K: PartialEq, + where + F: FnMut(&I::Item) -> K, + K: PartialEq, { self.inner.borrow_mut().step(client) } @@ -334,11 +353,12 @@ impl GroupBy } } -impl<'a, K, I, F> IntoIterator for &'a GroupBy - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq +impl<'a, K, I, F> IntoIterator for &'a ChunkBy +where + I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq, { type Item = (K, Group<'a, K, I, F>); type IntoIter = Groups<'a, K, I, F>; @@ -348,26 +368,29 @@ impl<'a, K, I, F> IntoIterator for &'a GroupBy } } - /// An iterator that yields the Group iterators. /// /// Iterator element type is `(K, Group)`: /// the group's key `K` and the group's iterator. /// -/// See [`.group_by()`](crate::Itertools::group_by) for more information. +/// See [`.chunk_by()`](crate::Itertools::chunk_by) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Groups<'a, K: 'a, I: 'a, F: 'a> - where I: Iterator, - I::Item: 'a +pub struct Groups<'a, K, I, F> +where + I: Iterator + 'a, + I::Item: 'a, + K: 'a, + F: 'a, { - parent: &'a GroupBy, + parent: &'a ChunkBy, } impl<'a, K, I, F> Iterator for Groups<'a, K, I, F> - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq +where + I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq, { type Item = (K, Group<'a, K, I, F>); @@ -378,11 +401,14 @@ impl<'a, K, I, F> Iterator for Groups<'a, K, I, F> let inner = &mut *self.parent.inner.borrow_mut(); inner.step(index).map(|elt| { let key = inner.group_key(index); - (key, Group { - parent: self.parent, - index, - first: Some(elt), - }) + ( + key, + Group { + parent: self.parent, + index, + first: Some(elt), + }, + ) }) } } @@ -390,18 +416,22 @@ impl<'a, K, I, F> Iterator for Groups<'a, K, I, F> /// An iterator for the elements in a single group. /// /// Iterator element type is `I::Item`. -pub struct Group<'a, K: 'a, I: 'a, F: 'a> - where I: Iterator, - I::Item: 'a, +pub struct Group<'a, K, I, F> +where + I: Iterator + 'a, + I::Item: 'a, + K: 'a, + F: 'a, { - parent: &'a GroupBy, + parent: &'a ChunkBy, index: usize, first: Option, } impl<'a, K, I, F> Drop for Group<'a, K, I, F> - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { fn drop(&mut self) { self.parent.drop_group(self.index); @@ -409,10 +439,11 @@ impl<'a, K, I, F> Drop for Group<'a, K, I, F> } impl<'a, K, I, F> Iterator for Group<'a, K, I, F> - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq, +where + I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq, { type Item = I::Item; #[inline] @@ -428,7 +459,8 @@ impl<'a, K, I, F> Iterator for Group<'a, K, I, F> /// Create a new pub fn new_chunks(iter: J, size: usize) -> IntoChunks - where J: IntoIterator, +where + J: IntoIterator, { IntoChunks { inner: RefCell::new(GroupInner { @@ -447,10 +479,9 @@ pub fn new_chunks(iter: J, size: usize) -> IntoChunks } } - /// `ChunkLazy` is the storage for a lazy chunking operation. /// -/// `IntoChunks` behaves just like `GroupBy`: it is iterable, and +/// `IntoChunks` behaves just like `ChunkBy`: it is iterable, and /// it only buffers if several chunk iterators are alive at the same time. /// /// This type implements [`IntoIterator`] (it is **not** an iterator @@ -463,7 +494,8 @@ pub fn new_chunks(iter: J, size: usize) -> IntoChunks /// See [`.chunks()`](crate::Itertools::chunks) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct IntoChunks - where I: Iterator, +where + I: Iterator, { inner: RefCell>, // the chunk iterator's current index. Keep this in the main value @@ -471,9 +503,17 @@ pub struct IntoChunks index: Cell, } +impl Clone for IntoChunks +where + I: Clone + Iterator, + I::Item: Clone, +{ + clone_fields!(inner, index); +} impl IntoChunks - where I: Iterator, +where + I: Iterator, { /// `client`: Index of chunk that requests next element fn step(&self, client: usize) -> Option { @@ -487,36 +527,37 @@ impl IntoChunks } impl<'a, I> IntoIterator for &'a IntoChunks - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { type Item = Chunk<'a, I>; type IntoIter = Chunks<'a, I>; fn into_iter(self) -> Self::IntoIter { - Chunks { - parent: self, - } + Chunks { parent: self } } } - /// An iterator that yields the Chunk iterators. /// /// Iterator element type is `Chunk`. /// /// See [`.chunks()`](crate::Itertools::chunks) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Chunks<'a, I: 'a> - where I: Iterator, - I::Item: 'a, +#[derive(Clone)] +pub struct Chunks<'a, I> +where + I: Iterator + 'a, + I::Item: 'a, { parent: &'a IntoChunks, } impl<'a, I> Iterator for Chunks<'a, I> - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { type Item = Chunk<'a, I>; @@ -525,12 +566,10 @@ impl<'a, I> Iterator for Chunks<'a, I> let index = self.parent.index.get(); self.parent.index.set(index + 1); let inner = &mut *self.parent.inner.borrow_mut(); - inner.step(index).map(|elt| { - Chunk { - parent: self.parent, - index, - first: Some(elt), - } + inner.step(index).map(|elt| Chunk { + parent: self.parent, + index, + first: Some(elt), }) } } @@ -538,9 +577,10 @@ impl<'a, I> Iterator for Chunks<'a, I> /// An iterator for the elements in a single chunk. /// /// Iterator element type is `I::Item`. -pub struct Chunk<'a, I: 'a> - where I: Iterator, - I::Item: 'a, +pub struct Chunk<'a, I> +where + I: Iterator + 'a, + I::Item: 'a, { parent: &'a IntoChunks, index: usize, @@ -548,8 +588,9 @@ pub struct Chunk<'a, I: 'a> } impl<'a, I> Drop for Chunk<'a, I> - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { fn drop(&mut self) { self.parent.drop_group(self.index); @@ -557,8 +598,9 @@ impl<'a, I> Drop for Chunk<'a, I> } impl<'a, I> Iterator for Chunk<'a, I> - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { type Item = I::Item; #[inline] diff --git a/third_party/rust/itertools/src/grouping_map.rs b/third_party/rust/itertools/src/grouping_map.rs index bb5b582c928..86cb55dc007 100644 --- a/third_party/rust/itertools/src/grouping_map.rs +++ b/third_party/rust/itertools/src/grouping_map.rs @@ -1,50 +1,58 @@ -#![cfg(feature = "use_std")] - -use crate::MinMaxResult; -use std::collections::HashMap; +use crate::{ + adaptors::map::{MapSpecialCase, MapSpecialCaseFn}, + MinMaxResult, +}; use std::cmp::Ordering; +use std::collections::HashMap; use std::hash::Hash; use std::iter::Iterator; use std::ops::{Add, Mul}; /// A wrapper to allow for an easy [`into_grouping_map_by`](crate::Itertools::into_grouping_map_by) -#[derive(Clone, Debug)] -pub struct MapForGrouping(I, F); +pub type MapForGrouping = MapSpecialCase>; -impl MapForGrouping { - pub(crate) fn new(iter: I, key_mapper: F) -> Self { - Self(iter, key_mapper) +#[derive(Clone)] +pub struct GroupingMapFn(F); + +impl std::fmt::Debug for GroupingMapFn { + debug_fmt_fields!(GroupingMapFn,); +} + +impl K> MapSpecialCaseFn for GroupingMapFn { + type Out = (K, V); + fn call(&mut self, v: V) -> Self::Out { + ((self.0)(&v), v) } } -impl Iterator for MapForGrouping - where I: Iterator, - K: Hash + Eq, - F: FnMut(&V) -> K, -{ - type Item = (K, V); - fn next(&mut self) -> Option { - self.0.next().map(|val| ((self.1)(&val), val)) +pub(crate) fn new_map_for_grouping K>( + iter: I, + key_mapper: F, +) -> MapForGrouping { + MapSpecialCase { + iter, + f: GroupingMapFn(key_mapper), } } /// Creates a new `GroupingMap` from `iter` pub fn new(iter: I) -> GroupingMap - where I: Iterator, - K: Hash + Eq, +where + I: Iterator, + K: Hash + Eq, { GroupingMap { iter } } /// `GroupingMapBy` is an intermediate struct for efficient group-and-fold operations. -/// +/// /// See [`GroupingMap`] for more informations. pub type GroupingMapBy = GroupingMap>; /// `GroupingMap` is an intermediate struct for efficient group-and-fold operations. /// It groups elements by their key and at the same time fold each group /// using some aggregating operation. -/// +/// /// No method on this struct performs temporary allocations. #[derive(Clone, Debug)] #[must_use = "GroupingMap is lazy and do nothing unless consumed"] @@ -53,13 +61,14 @@ pub struct GroupingMap { } impl GroupingMap - where I: Iterator, - K: Hash + Eq, +where + I: Iterator, + K: Hash + Eq, { /// This is the generic way to perform any operation on a `GroupingMap`. /// It's suggested to use this method only to implement custom operations /// when the already provided ones are not enough. - /// + /// /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements /// of each group sequentially, passing the previously accumulated value, a reference to the key /// and the current element as arguments, and stores the results in an `HashMap`. @@ -68,17 +77,17 @@ impl GroupingMap /// - the current value of the accumulator of the group if there is currently one; /// - a reference to the key of the group this element belongs to; /// - the element from the source being aggregated; - /// + /// /// If `operation` returns `Some(element)` then the accumulator is updated with `element`, /// otherwise the previous accumulation is discarded. /// /// Return a `HashMap` associating the key of each group with the result of aggregation of /// that group's elements. If the aggregation of the last element of a group discards the /// accumulator then there won't be an entry associated to that group's key. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let data = vec![2, 8, 5, 7, 9, 0, 4, 10]; /// let lookup = data.into_iter() /// .into_grouping_map_by(|&n| n % 4) @@ -89,7 +98,7 @@ impl GroupingMap /// Some(acc.unwrap_or(0) + val) /// } /// }); - /// + /// /// assert_eq!(lookup[&0], 4); // 0 resets the accumulator so only 4 is summed /// assert_eq!(lookup[&1], 5 + 9); /// assert_eq!(lookup.get(&2), None); // 10 resets the accumulator and nothing is summed afterward @@ -97,7 +106,8 @@ impl GroupingMap /// assert_eq!(lookup.len(), 3); // The final keys are only 0, 1 and 2 /// ``` pub fn aggregate(self, mut operation: FO) -> HashMap - where FO: FnMut(Option, &K, V) -> Option, + where + FO: FnMut(Option, &K, V) -> Option, { let mut destination_map = HashMap::new(); @@ -111,6 +121,50 @@ impl GroupingMap destination_map } + /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements + /// of each group sequentially, passing the previously accumulated value, a reference to the key + /// and the current element as arguments, and stores the results in a new map. + /// + /// `init` is called to obtain the initial value of each accumulator. + /// + /// `operation` is a function that is invoked on each element with the following parameters: + /// - the current value of the accumulator of the group; + /// - a reference to the key of the group this element belongs to; + /// - the element from the source being accumulated. + /// + /// Return a `HashMap` associating the key of each group with the result of folding that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// #[derive(Debug, Default)] + /// struct Accumulator { + /// acc: usize, + /// } + /// + /// let lookup = (1..=7) + /// .into_grouping_map_by(|&n| n % 3) + /// .fold_with(|_key, _val| Default::default(), |Accumulator { acc }, _key, val| { + /// let acc = acc + val; + /// Accumulator { acc } + /// }); + /// + /// assert_eq!(lookup[&0].acc, 3 + 6); + /// assert_eq!(lookup[&1].acc, 1 + 4 + 7); + /// assert_eq!(lookup[&2].acc, 2 + 5); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn fold_with(self, mut init: FI, mut operation: FO) -> HashMap + where + FI: FnMut(&K, &V) -> R, + FO: FnMut(R, &K, V) -> R, + { + self.aggregate(|acc, key, val| { + let acc = acc.unwrap_or_else(|| init(key, &val)); + Some(operation(acc, key, val)) + }) + } + /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements /// of each group sequentially, passing the previously accumulated value, a reference to the key /// and the current element as arguments, and stores the results in a new map. @@ -123,27 +177,25 @@ impl GroupingMap /// - the element from the source being accumulated. /// /// Return a `HashMap` associating the key of each group with the result of folding that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = (1..=7) /// .into_grouping_map_by(|&n| n % 3) /// .fold(0, |acc, _key, val| acc + val); - /// + /// /// assert_eq!(lookup[&0], 3 + 6); /// assert_eq!(lookup[&1], 1 + 4 + 7); /// assert_eq!(lookup[&2], 2 + 5); /// assert_eq!(lookup.len(), 3); /// ``` - pub fn fold(self, init: R, mut operation: FO) -> HashMap - where R: Clone, - FO: FnMut(R, &K, V) -> R, + pub fn fold(self, init: R, operation: FO) -> HashMap + where + R: Clone, + FO: FnMut(R, &K, V) -> R, { - self.aggregate(|acc, key, val| { - let acc = acc.unwrap_or_else(|| init.clone()); - Some(operation(acc, key, val)) - }) + self.fold_with(|_, _| init.clone(), operation) } /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements @@ -158,23 +210,24 @@ impl GroupingMap /// - the element from the source being accumulated. /// /// Return a `HashMap` associating the key of each group with the result of folding that group's elements. - /// + /// /// [`fold`]: GroupingMap::fold - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = (1..=7) /// .into_grouping_map_by(|&n| n % 3) - /// .fold_first(|acc, _key, val| acc + val); - /// + /// .reduce(|acc, _key, val| acc + val); + /// /// assert_eq!(lookup[&0], 3 + 6); /// assert_eq!(lookup[&1], 1 + 4 + 7); /// assert_eq!(lookup[&2], 2 + 5); /// assert_eq!(lookup.len(), 3); /// ``` - pub fn fold_first(self, mut operation: FO) -> HashMap - where FO: FnMut(V, &K, V) -> V, + pub fn reduce(self, mut operation: FO) -> HashMap + where + FO: FnMut(V, &K, V) -> V, { self.aggregate(|acc, key, val| { Some(match acc { @@ -184,250 +237,271 @@ impl GroupingMap }) } + /// See [`.reduce()`](GroupingMap::reduce). + #[deprecated(note = "Use .reduce() instead", since = "0.13.0")] + pub fn fold_first(self, operation: FO) -> HashMap + where + FO: FnMut(V, &K, V) -> V, + { + self.reduce(operation) + } + /// Groups elements from the `GroupingMap` source by key and collects the elements of each group in - /// an instance of `C`. The iteration order is preserved when inserting elements. - /// + /// an instance of `C`. The iteration order is preserved when inserting elements. + /// /// Return a `HashMap` associating the key of each group with the collection containing that group's elements. - /// + /// /// ``` /// use itertools::Itertools; /// use std::collections::HashSet; - /// + /// /// let lookup = vec![0, 1, 2, 3, 4, 5, 6, 2, 3, 6].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .collect::>(); - /// + /// /// assert_eq!(lookup[&0], vec![0, 3, 6].into_iter().collect::>()); /// assert_eq!(lookup[&1], vec![1, 4].into_iter().collect::>()); /// assert_eq!(lookup[&2], vec![2, 5].into_iter().collect::>()); /// assert_eq!(lookup.len(), 3); /// ``` pub fn collect(self) -> HashMap - where C: Default + Extend, + where + C: Default + Extend, { let mut destination_map = HashMap::new(); self.iter.for_each(|(key, val)| { - destination_map.entry(key).or_insert_with(C::default).extend(Some(val)); + destination_map + .entry(key) + .or_insert_with(C::default) + .extend(Some(val)); }); destination_map } /// Groups elements from the `GroupingMap` source by key and finds the maximum of each group. - /// + /// /// If several elements are equally maximum, the last element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .max(); - /// + /// /// assert_eq!(lookup[&0], 12); /// assert_eq!(lookup[&1], 7); /// assert_eq!(lookup[&2], 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn max(self) -> HashMap - where V: Ord, + where + V: Ord, { self.max_by(|_, v1, v2| V::cmp(v1, v2)) } /// Groups elements from the `GroupingMap` source by key and finds the maximum of each group /// with respect to the specified comparison function. - /// + /// /// If several elements are equally maximum, the last element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .max_by(|_key, x, y| y.cmp(x)); - /// + /// /// assert_eq!(lookup[&0], 3); /// assert_eq!(lookup[&1], 1); /// assert_eq!(lookup[&2], 5); /// assert_eq!(lookup.len(), 3); /// ``` pub fn max_by(self, mut compare: F) -> HashMap - where F: FnMut(&K, &V, &V) -> Ordering, + where + F: FnMut(&K, &V, &V) -> Ordering, { - self.fold_first(|acc, key, val| match compare(key, &acc, &val) { + self.reduce(|acc, key, val| match compare(key, &acc, &val) { Ordering::Less | Ordering::Equal => val, - Ordering::Greater => acc + Ordering::Greater => acc, }) } /// Groups elements from the `GroupingMap` source by key and finds the element of each group /// that gives the maximum from the specified function. - /// + /// /// If several elements are equally maximum, the last element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .max_by_key(|_key, &val| val % 4); - /// + /// /// assert_eq!(lookup[&0], 3); /// assert_eq!(lookup[&1], 7); /// assert_eq!(lookup[&2], 5); /// assert_eq!(lookup.len(), 3); /// ``` pub fn max_by_key(self, mut f: F) -> HashMap - where F: FnMut(&K, &V) -> CK, - CK: Ord, + where + F: FnMut(&K, &V) -> CK, + CK: Ord, { self.max_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) } /// Groups elements from the `GroupingMap` source by key and finds the minimum of each group. - /// + /// /// If several elements are equally minimum, the first element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .min(); - /// + /// /// assert_eq!(lookup[&0], 3); /// assert_eq!(lookup[&1], 1); /// assert_eq!(lookup[&2], 5); /// assert_eq!(lookup.len(), 3); /// ``` pub fn min(self) -> HashMap - where V: Ord, + where + V: Ord, { self.min_by(|_, v1, v2| V::cmp(v1, v2)) } /// Groups elements from the `GroupingMap` source by key and finds the minimum of each group /// with respect to the specified comparison function. - /// + /// /// If several elements are equally minimum, the first element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .min_by(|_key, x, y| y.cmp(x)); - /// + /// /// assert_eq!(lookup[&0], 12); /// assert_eq!(lookup[&1], 7); /// assert_eq!(lookup[&2], 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn min_by(self, mut compare: F) -> HashMap - where F: FnMut(&K, &V, &V) -> Ordering, + where + F: FnMut(&K, &V, &V) -> Ordering, { - self.fold_first(|acc, key, val| match compare(key, &acc, &val) { + self.reduce(|acc, key, val| match compare(key, &acc, &val) { Ordering::Less | Ordering::Equal => acc, - Ordering::Greater => val + Ordering::Greater => val, }) } /// Groups elements from the `GroupingMap` source by key and finds the element of each group /// that gives the minimum from the specified function. - /// + /// /// If several elements are equally minimum, the first element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .min_by_key(|_key, &val| val % 4); - /// + /// /// assert_eq!(lookup[&0], 12); /// assert_eq!(lookup[&1], 4); /// assert_eq!(lookup[&2], 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn min_by_key(self, mut f: F) -> HashMap - where F: FnMut(&K, &V) -> CK, - CK: Ord, + where + F: FnMut(&K, &V) -> CK, + CK: Ord, { self.min_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) } /// Groups elements from the `GroupingMap` source by key and find the maximum and minimum of /// each group. - /// + /// /// If several elements are equally maximum, the last element is picked. /// If several elements are equally minimum, the first element is picked. - /// - /// See [.minmax()](crate::Itertools::minmax) for the non-grouping version. - /// + /// + /// See [`Itertools::minmax`](crate::Itertools::minmax) for the non-grouping version. + /// /// Differences from the non grouping version: /// - It never produces a `MinMaxResult::NoElements` /// - It doesn't have any speedup - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; /// use itertools::MinMaxResult::{OneElement, MinMax}; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .minmax(); - /// + /// /// assert_eq!(lookup[&0], MinMax(3, 12)); /// assert_eq!(lookup[&1], MinMax(1, 7)); /// assert_eq!(lookup[&2], OneElement(5)); /// assert_eq!(lookup.len(), 3); /// ``` pub fn minmax(self) -> HashMap> - where V: Ord, + where + V: Ord, { self.minmax_by(|_, v1, v2| V::cmp(v1, v2)) } /// Groups elements from the `GroupingMap` source by key and find the maximum and minimum of /// each group with respect to the specified comparison function. - /// + /// /// If several elements are equally maximum, the last element is picked. /// If several elements are equally minimum, the first element is picked. - /// + /// /// It has the same differences from the non-grouping version as `minmax`. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; /// use itertools::MinMaxResult::{OneElement, MinMax}; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .minmax_by(|_key, x, y| y.cmp(x)); - /// + /// /// assert_eq!(lookup[&0], MinMax(12, 3)); /// assert_eq!(lookup[&1], MinMax(7, 1)); /// assert_eq!(lookup[&2], OneElement(5)); /// assert_eq!(lookup.len(), 3); /// ``` pub fn minmax_by(self, mut compare: F) -> HashMap> - where F: FnMut(&K, &V, &V) -> Ordering, + where + F: FnMut(&K, &V, &V) -> Ordering, { self.aggregate(|acc, key, val| { Some(match acc { @@ -455,81 +529,84 @@ impl GroupingMap /// Groups elements from the `GroupingMap` source by key and find the elements of each group /// that gives the minimum and maximum from the specified function. - /// + /// /// If several elements are equally maximum, the last element is picked. /// If several elements are equally minimum, the first element is picked. - /// + /// /// It has the same differences from the non-grouping version as `minmax`. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; /// use itertools::MinMaxResult::{OneElement, MinMax}; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .minmax_by_key(|_key, &val| val % 4); - /// + /// /// assert_eq!(lookup[&0], MinMax(12, 3)); /// assert_eq!(lookup[&1], MinMax(4, 7)); /// assert_eq!(lookup[&2], OneElement(5)); /// assert_eq!(lookup.len(), 3); /// ``` pub fn minmax_by_key(self, mut f: F) -> HashMap> - where F: FnMut(&K, &V) -> CK, - CK: Ord, + where + F: FnMut(&K, &V) -> CK, + CK: Ord, { self.minmax_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) } - + /// Groups elements from the `GroupingMap` source by key and sums them. - /// - /// This is just a shorthand for `self.fold_first(|acc, _, val| acc + val)`. + /// + /// This is just a shorthand for `self.reduce(|acc, _, val| acc + val)`. /// It is more limited than `Iterator::sum` since it doesn't use the `Sum` trait. - /// + /// /// Returns a `HashMap` associating the key of each group with the sum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .sum(); - /// + /// /// assert_eq!(lookup[&0], 3 + 9 + 12); /// assert_eq!(lookup[&1], 1 + 4 + 7); /// assert_eq!(lookup[&2], 5 + 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn sum(self) -> HashMap - where V: Add + where + V: Add, { - self.fold_first(|acc, _, val| acc + val) + self.reduce(|acc, _, val| acc + val) } /// Groups elements from the `GroupingMap` source by key and multiply them. - /// - /// This is just a shorthand for `self.fold_first(|acc, _, val| acc * val)`. + /// + /// This is just a shorthand for `self.reduce(|acc, _, val| acc * val)`. /// It is more limited than `Iterator::product` since it doesn't use the `Product` trait. - /// + /// /// Returns a `HashMap` associating the key of each group with the product of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .product(); - /// + /// /// assert_eq!(lookup[&0], 3 * 9 * 12); /// assert_eq!(lookup[&1], 1 * 4 * 7); /// assert_eq!(lookup[&2], 5 * 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn product(self) -> HashMap - where V: Mul, + where + V: Mul, { - self.fold_first(|acc, _, val| acc * val) + self.reduce(|acc, _, val| acc * val) } } diff --git a/third_party/rust/itertools/src/impl_macros.rs b/third_party/rust/itertools/src/impl_macros.rs index a029843b05f..3db5ba02196 100644 --- a/third_party/rust/itertools/src/impl_macros.rs +++ b/third_party/rust/itertools/src/impl_macros.rs @@ -1,4 +1,4 @@ -//! +//! //! Implementation's internal macros macro_rules! debug_fmt_fields { @@ -27,3 +27,8 @@ macro_rules! clone_fields { macro_rules! ignore_ident{ ($id:ident, $($t:tt)*) => {$($t)*}; } + +macro_rules! count_ident { + () => {0}; + ($i0:ident $($i:ident)*) => {1 + count_ident!($($i)*)}; +} diff --git a/third_party/rust/itertools/src/intersperse.rs b/third_party/rust/itertools/src/intersperse.rs index 10a3a5389c0..5f4f7938ad0 100644 --- a/third_party/rust/itertools/src/intersperse.rs +++ b/third_party/rust/itertools/src/intersperse.rs @@ -1,5 +1,5 @@ -use std::iter::{Fuse, FusedIterator}; use super::size_hint; +use std::iter::{Fuse, FusedIterator}; pub trait IntersperseElement { fn generate(&mut self) -> Item; @@ -26,12 +26,13 @@ pub type Intersperse = IntersperseWith(iter: I, elt: I::Item) -> Intersperse - where I: Iterator, +where + I: Iterator, { intersperse_with(iter, IntersperseElementSimple(elt)) } -implItem> IntersperseElement for F { +impl Item> IntersperseElement for F { fn generate(&mut self) -> Item { self() } @@ -48,71 +49,94 @@ implItem> IntersperseElement for F { #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[derive(Clone, Debug)] pub struct IntersperseWith - where I: Iterator, +where + I: Iterator, { element: ElemF, iter: Fuse, - peek: Option, + /// `peek` is None while no item have been taken out of `iter` (at definition). + /// Then `peek` will alternatively be `Some(None)` and `Some(Some(item))`, + /// where `None` indicates it's time to generate from `element` (unless `iter` is empty). + peek: Option>, } /// Create a new `IntersperseWith` iterator pub fn intersperse_with(iter: I, elt: ElemF) -> IntersperseWith - where I: Iterator, +where + I: Iterator, { - let mut iter = iter.fuse(); IntersperseWith { - peek: iter.next(), - iter, + peek: None, + iter: iter.fuse(), element: elt, } } impl Iterator for IntersperseWith - where I: Iterator, - ElemF: IntersperseElement +where + I: Iterator, + ElemF: IntersperseElement, { type Item = I::Item; #[inline] fn next(&mut self) -> Option { - if self.peek.is_some() { - self.peek.take() - } else { - self.peek = self.iter.next(); - if self.peek.is_some() { - Some(self.element.generate()) - } else { - None + let Self { + element, + iter, + peek, + } = self; + match peek { + Some(item @ Some(_)) => item.take(), + Some(None) => match iter.next() { + new @ Some(_) => { + *peek = Some(new); + Some(element.generate()) + } + None => None, + }, + None => { + *peek = Some(None); + iter.next() } } } fn size_hint(&self) -> (usize, Option) { - // 2 * SH + { 1 or 0 } - let has_peek = self.peek.is_some() as usize; - let sh = self.iter.size_hint(); - size_hint::add_scalar(size_hint::add(sh, sh), has_peek) + let mut sh = self.iter.size_hint(); + sh = size_hint::add(sh, sh); + match self.peek { + Some(Some(_)) => size_hint::add_scalar(sh, 1), + Some(None) => sh, + None => size_hint::sub_scalar(sh, 1), + } } - fn fold(mut self, init: B, mut f: F) -> B where - Self: Sized, F: FnMut(B, Self::Item) -> B, + fn fold(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, { + let Self { + mut element, + mut iter, + peek, + } = self; let mut accum = init; - if let Some(x) = self.peek.take() { + if let Some(x) = peek.unwrap_or_else(|| iter.next()) { accum = f(accum, x); } - let element = &mut self.element; - - self.iter.fold(accum, - |accum, x| { - let accum = f(accum, element.generate()); - f(accum, x) + iter.fold(accum, |accum, x| { + let accum = f(accum, element.generate()); + f(accum, x) }) } } impl FusedIterator for IntersperseWith - where I: Iterator, - ElemF: IntersperseElement -{} +where + I: Iterator, + ElemF: IntersperseElement, +{ +} diff --git a/third_party/rust/itertools/src/iter_index.rs b/third_party/rust/itertools/src/iter_index.rs new file mode 100644 index 00000000000..aadaa72a766 --- /dev/null +++ b/third_party/rust/itertools/src/iter_index.rs @@ -0,0 +1,116 @@ +use core::iter::{Skip, Take}; +use core::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive}; + +#[cfg(doc)] +use crate::Itertools; + +mod private_iter_index { + use core::ops; + + pub trait Sealed {} + + impl Sealed for ops::Range {} + impl Sealed for ops::RangeInclusive {} + impl Sealed for ops::RangeTo {} + impl Sealed for ops::RangeToInclusive {} + impl Sealed for ops::RangeFrom {} + impl Sealed for ops::RangeFull {} +} + +/// Used by [`Itertools::get`] to know which iterator +/// to turn different ranges into. +pub trait IteratorIndex: private_iter_index::Sealed +where + I: Iterator, +{ + /// The type returned for this type of index. + type Output: Iterator; + + /// Returns an adapted iterator for the current index. + /// + /// Prefer calling [`Itertools::get`] instead + /// of calling this directly. + fn index(self, from: I) -> Self::Output; +} + +impl IteratorIndex for Range +where + I: Iterator, +{ + type Output = Skip>; + + fn index(self, iter: I) -> Self::Output { + iter.take(self.end).skip(self.start) + } +} + +impl IteratorIndex for RangeInclusive +where + I: Iterator, +{ + type Output = Take>; + + fn index(self, iter: I) -> Self::Output { + // end - start + 1 without overflowing if possible + let length = if *self.end() == usize::MAX { + assert_ne!(*self.start(), 0); + self.end() - self.start() + 1 + } else { + (self.end() + 1).saturating_sub(*self.start()) + }; + iter.skip(*self.start()).take(length) + } +} + +impl IteratorIndex for RangeTo +where + I: Iterator, +{ + type Output = Take; + + fn index(self, iter: I) -> Self::Output { + iter.take(self.end) + } +} + +impl IteratorIndex for RangeToInclusive +where + I: Iterator, +{ + type Output = Take; + + fn index(self, iter: I) -> Self::Output { + assert_ne!(self.end, usize::MAX); + iter.take(self.end + 1) + } +} + +impl IteratorIndex for RangeFrom +where + I: Iterator, +{ + type Output = Skip; + + fn index(self, iter: I) -> Self::Output { + iter.skip(self.start) + } +} + +impl IteratorIndex for RangeFull +where + I: Iterator, +{ + type Output = I; + + fn index(self, iter: I) -> Self::Output { + iter + } +} + +pub fn get(iter: I, index: R) -> R::Output +where + I: IntoIterator, + R: IteratorIndex, +{ + index.index(iter.into_iter()) +} diff --git a/third_party/rust/itertools/src/k_smallest.rs b/third_party/rust/itertools/src/k_smallest.rs index acaea5941cb..7e4ace262b7 100644 --- a/third_party/rust/itertools/src/k_smallest.rs +++ b/third_party/rust/itertools/src/k_smallest.rs @@ -1,20 +1,138 @@ -use alloc::collections::BinaryHeap; -use core::cmp::Ord; +use alloc::vec::Vec; +use core::cmp::Ordering; -pub(crate) fn k_smallest>(mut iter: I, k: usize) -> BinaryHeap { - if k == 0 { return BinaryHeap::new(); } +/// Consumes a given iterator, returning the minimum elements in **ascending** order. +pub(crate) fn k_smallest_general(iter: I, k: usize, mut comparator: F) -> Vec +where + I: Iterator, + F: FnMut(&I::Item, &I::Item) -> Ordering, +{ + /// Sift the element currently at `origin` away from the root until it is properly ordered. + /// + /// This will leave **larger** elements closer to the root of the heap. + fn sift_down(heap: &mut [T], is_less_than: &mut F, mut origin: usize) + where + F: FnMut(&T, &T) -> bool, + { + #[inline] + fn children_of(n: usize) -> (usize, usize) { + (2 * n + 1, 2 * n + 2) + } - let mut heap = iter.by_ref().take(k).collect::>(); + while origin < heap.len() { + let (left_idx, right_idx) = children_of(origin); + if left_idx >= heap.len() { + return; + } - iter.for_each(|i| { - debug_assert_eq!(heap.len(), k); - // Equivalent to heap.push(min(i, heap.pop())) but more efficient. - // This should be done with a single `.peek_mut().unwrap()` but - // `PeekMut` sifts-down unconditionally on Rust 1.46.0 and prior. - if *heap.peek().unwrap() > i { - *heap.peek_mut().unwrap() = i; + let replacement_idx = + if right_idx < heap.len() && is_less_than(&heap[left_idx], &heap[right_idx]) { + right_idx + } else { + left_idx + }; + + if is_less_than(&heap[origin], &heap[replacement_idx]) { + heap.swap(origin, replacement_idx); + origin = replacement_idx; + } else { + return; + } + } + } + + if k == 0 { + iter.last(); + return Vec::new(); + } + if k == 1 { + return iter.min_by(comparator).into_iter().collect(); + } + let mut iter = iter.fuse(); + let mut storage: Vec = iter.by_ref().take(k).collect(); + + let mut is_less_than = move |a: &_, b: &_| comparator(a, b) == Ordering::Less; + + // Rearrange the storage into a valid heap by reordering from the second-bottom-most layer up to the root. + // Slightly faster than ordering on each insert, but only by a factor of lg(k). + // The resulting heap has the **largest** item on top. + for i in (0..=(storage.len() / 2)).rev() { + sift_down(&mut storage, &mut is_less_than, i); + } + + iter.for_each(|val| { + debug_assert_eq!(storage.len(), k); + if is_less_than(&val, &storage[0]) { + // Treating this as an push-and-pop saves having to write a sift-up implementation. + // https://en.wikipedia.org/wiki/Binary_heap#Insert_then_extract + storage[0] = val; + // We retain the smallest items we've seen so far, but ordered largest first so we can drop the largest efficiently. + sift_down(&mut storage, &mut is_less_than, 0); } }); - heap + // Ultimately the items need to be in least-first, strict order, but the heap is currently largest-first. + // To achieve this, repeatedly, + // 1) "pop" the largest item off the heap into the tail slot of the underlying storage, + // 2) shrink the logical size of the heap by 1, + // 3) restore the heap property over the remaining items. + let mut heap = &mut storage[..]; + while heap.len() > 1 { + let last_idx = heap.len() - 1; + heap.swap(0, last_idx); + // Sifting over a truncated slice means that the sifting will not disturb already popped elements. + heap = &mut heap[..last_idx]; + sift_down(heap, &mut is_less_than, 0); + } + + storage +} + +pub(crate) fn k_smallest_relaxed_general(iter: I, k: usize, mut comparator: F) -> Vec +where + I: Iterator, + F: FnMut(&I::Item, &I::Item) -> Ordering, +{ + if k == 0 { + iter.last(); + return Vec::new(); + } + + let mut iter = iter.fuse(); + let mut buf = iter.by_ref().take(2 * k).collect::>(); + + if buf.len() < k { + buf.sort_unstable_by(&mut comparator); + return buf; + } + + buf.select_nth_unstable_by(k - 1, &mut comparator); + buf.truncate(k); + + iter.for_each(|val| { + if comparator(&val, &buf[k - 1]) != Ordering::Less { + return; + } + + assert_ne!(buf.len(), buf.capacity()); + buf.push(val); + + if buf.len() == 2 * k { + buf.select_nth_unstable_by(k - 1, &mut comparator); + buf.truncate(k); + } + }); + + buf.sort_unstable_by(&mut comparator); + buf.truncate(k); + buf +} + +#[inline] +pub(crate) fn key_to_cmp(mut key: F) -> impl FnMut(&T, &T) -> Ordering +where + F: FnMut(&T) -> K, + K: Ord, +{ + move |a, b| key(a).cmp(&key(b)) } diff --git a/third_party/rust/itertools/src/kmerge_impl.rs b/third_party/rust/itertools/src/kmerge_impl.rs index 509d5fc6a3e..9ea73f9e8b1 100644 --- a/third_party/rust/itertools/src/kmerge_impl.rs +++ b/third_party/rust/itertools/src/kmerge_impl.rs @@ -1,10 +1,9 @@ use crate::size_hint; -use crate::Itertools; use alloc::vec::Vec; +use std::fmt; use std::iter::FusedIterator; use std::mem::replace; -use std::fmt; /// Head element and Tail iterator pair /// @@ -15,24 +14,21 @@ use std::fmt; /// `KMerge` into a min-heap. #[derive(Debug)] struct HeadTail - where I: Iterator +where + I: Iterator, { head: I::Item, tail: I, } impl HeadTail - where I: Iterator +where + I: Iterator, { /// Constructs a `HeadTail` from an `Iterator`. Returns `None` if the `Iterator` is empty. - fn new(mut it: I) -> Option> { + fn new(mut it: I) -> Option { let head = it.next(); - head.map(|h| { - HeadTail { - head: h, - tail: it, - } - }) + head.map(|h| Self { head: h, tail: it }) } /// Get the next element and update `head`, returning the old head in `Some`. @@ -53,15 +49,17 @@ impl HeadTail } impl Clone for HeadTail - where I: Iterator + Clone, - I::Item: Clone +where + I: Iterator + Clone, + I::Item: Clone, { clone_fields!(head, tail); } /// Make `data` a heap (min-heap w.r.t the sorting). fn heapify(data: &mut [T], mut less_than: S) - where S: FnMut(&T, &T) -> bool +where + S: FnMut(&T, &T) -> bool, { for i in (0..data.len() / 2).rev() { sift_down(data, i, &mut less_than); @@ -70,7 +68,8 @@ fn heapify(data: &mut [T], mut less_than: S) /// Sift down element at `index` (`heap` is a min-heap wrt the ordering) fn sift_down(heap: &mut [T], index: usize, mut less_than: S) - where S: FnMut(&T, &T) -> bool +where + S: FnMut(&T, &T) -> bool, { debug_assert!(index <= heap.len()); let mut pos = index; @@ -81,7 +80,7 @@ fn sift_down(heap: &mut [T], index: usize, mut less_than: S) while child + 1 < heap.len() { // pick the smaller of the two children // use arithmetic to avoid an unpredictable branch - child += less_than(&heap[child+1], &heap[child]) as usize; + child += less_than(&heap[child + 1], &heap[child]) as usize; // sift down is done if we are already in order if !less_than(&heap[child], &heap[pos]) { @@ -119,7 +118,7 @@ impl KMergePredicate for KMergeByLt { } } -implbool> KMergePredicate for F { +impl bool> KMergePredicate for F { fn kmerge_pred(&mut self, a: &T, b: &T) -> bool { self(a, b) } @@ -128,19 +127,21 @@ implbool> KMergePredicate for F { /// Create an iterator that merges elements of the contained iterators using /// the ordering function. /// -/// [`IntoIterator`] enabled version of [`Itertools::kmerge`]. +/// [`IntoIterator`] enabled version of [`Itertools::kmerge`](crate::Itertools::kmerge). /// /// ``` /// use itertools::kmerge; /// /// for elt in kmerge(vec![vec![0, 2, 4], vec![1, 3, 5], vec![6, 7]]) { /// /* loop body */ +/// # let _ = elt; /// } /// ``` pub fn kmerge(iterable: I) -> KMerge<::IntoIter> - where I: IntoIterator, - I::Item: IntoIterator, - <::Item as IntoIterator>::Item: PartialOrd +where + I: IntoIterator, + I::Item: IntoIterator, + <::Item as IntoIterator>::Item: PartialOrd, { kmerge_by(iterable, KMergeByLt) } @@ -152,29 +153,34 @@ pub fn kmerge(iterable: I) -> KMerge<::IntoIter> /// /// See [`.kmerge_by()`](crate::Itertools::kmerge_by) for more /// information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[must_use = "this iterator adaptor is not lazy but does nearly nothing unless consumed"] pub struct KMergeBy - where I: Iterator, +where + I: Iterator, { heap: Vec>, less_than: F, } impl fmt::Debug for KMergeBy - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, { debug_fmt_fields!(KMergeBy, heap); } /// Create an iterator that merges elements of the contained iterators. /// -/// [`IntoIterator`] enabled version of [`Itertools::kmerge_by`]. -pub fn kmerge_by(iterable: I, mut less_than: F) - -> KMergeBy<::IntoIter, F> - where I: IntoIterator, - I::Item: IntoIterator, - F: KMergePredicate<<::Item as IntoIterator>::Item>, +/// [`IntoIterator`] enabled version of [`Itertools::kmerge_by`](crate::Itertools::kmerge_by). +pub fn kmerge_by( + iterable: I, + mut less_than: F, +) -> KMergeBy<::IntoIter, F> +where + I: IntoIterator, + I::Item: IntoIterator, + F: KMergePredicate<<::Item as IntoIterator>::Item>, { let iter = iterable.into_iter(); let (lower, _) = iter.size_hint(); @@ -185,16 +191,18 @@ pub fn kmerge_by(iterable: I, mut less_than: F) } impl Clone for KMergeBy - where I: Iterator + Clone, - I::Item: Clone, - F: Clone, +where + I: Iterator + Clone, + I::Item: Clone, + F: Clone, { clone_fields!(heap, less_than); } impl Iterator for KMergeBy - where I: Iterator, - F: KMergePredicate +where + I: Iterator, + F: KMergePredicate, { type Item = I::Item; @@ -208,20 +216,24 @@ impl Iterator for KMergeBy self.heap.swap_remove(0).head }; let less_than = &mut self.less_than; - sift_down(&mut self.heap, 0, |a, b| less_than.kmerge_pred(&a.head, &b.head)); + sift_down(&mut self.heap, 0, |a, b| { + less_than.kmerge_pred(&a.head, &b.head) + }); Some(result) } fn size_hint(&self) -> (usize, Option) { - #[allow(deprecated)] //TODO: once msrv hits 1.51. replace `fold1` with `reduce` - self.heap.iter() - .map(|i| i.size_hint()) - .fold1(size_hint::add) - .unwrap_or((0, Some(0))) + self.heap + .iter() + .map(|i| i.size_hint()) + .reduce(size_hint::add) + .unwrap_or((0, Some(0))) } } impl FusedIterator for KMergeBy - where I: Iterator, - F: KMergePredicate -{} +where + I: Iterator, + F: KMergePredicate, +{ +} diff --git a/third_party/rust/itertools/src/lazy_buffer.rs b/third_party/rust/itertools/src/lazy_buffer.rs index ca24062aab0..fafa5f72613 100644 --- a/third_party/rust/itertools/src/lazy_buffer.rs +++ b/third_party/rust/itertools/src/lazy_buffer.rs @@ -1,10 +1,12 @@ -use std::ops::Index; use alloc::vec::Vec; +use std::iter::Fuse; +use std::ops::Index; + +use crate::size_hint::{self, SizeHint}; #[derive(Debug, Clone)] pub struct LazyBuffer { - pub it: I, - done: bool, + it: Fuse, buffer: Vec, } @@ -12,10 +14,9 @@ impl LazyBuffer where I: Iterator, { - pub fn new(it: I) -> LazyBuffer { - LazyBuffer { - it, - done: false, + pub fn new(it: I) -> Self { + Self { + it: it.fuse(), buffer: Vec::new(), } } @@ -24,36 +25,51 @@ where self.buffer.len() } + pub fn size_hint(&self) -> SizeHint { + size_hint::add_scalar(self.it.size_hint(), self.len()) + } + + pub fn count(self) -> usize { + self.len() + self.it.count() + } + pub fn get_next(&mut self) -> bool { - if self.done { - return false; - } if let Some(x) = self.it.next() { self.buffer.push(x); true } else { - self.done = true; false } } pub fn prefill(&mut self, len: usize) { let buffer_len = self.buffer.len(); - - if !self.done && len > buffer_len { + if len > buffer_len { let delta = len - buffer_len; - self.buffer.extend(self.it.by_ref().take(delta)); - self.done = self.buffer.len() < len; } } } +impl LazyBuffer +where + I: Iterator, + I::Item: Clone, +{ + pub fn get_at(&self, indices: &[usize]) -> Vec { + indices.iter().map(|i| self.buffer[*i].clone()).collect() + } + + pub fn get_array(&self, indices: [usize; K]) -> [I::Item; K] { + indices.map(|i| self.buffer[i].clone()) + } +} + impl Index for LazyBuffer where I: Iterator, I::Item: Sized, - Vec: Index + Vec: Index, { type Output = as Index>::Output; diff --git a/third_party/rust/itertools/src/lib.rs b/third_party/rust/itertools/src/lib.rs index f91968870fa..20226d88a00 100644 --- a/third_party/rust/itertools/src/lib.rs +++ b/third_party/rust/itertools/src/lib.rs @@ -1,6 +1,7 @@ -#![warn(missing_docs)] -#![crate_name="itertools"] +#![warn(missing_docs, clippy::default_numeric_fallback)] +#![crate_name = "itertools"] #![cfg_attr(not(feature = "use_std"), no_std)] +#![doc(test(attr(deny(warnings), allow(deprecated, unstable_name_collisions))))] //! Extra iterator adaptors, functions and macros. //! @@ -8,6 +9,7 @@ //! the [`Itertools`] trait: //! //! ``` +//! # #[allow(unused_imports)] //! use itertools::Itertools; //! ``` //! @@ -29,6 +31,7 @@ //! //! for elt in interleave(&[1, 2, 3], &[2, 3, 4]) { //! /* loop body */ +//! # let _ = elt; //! } //! ``` //! @@ -37,13 +40,16 @@ //! - `use_std` //! - Enabled by default. //! - Disable to compile itertools using `#![no_std]`. This disables -//! any items that depend on collections (like `group_by`, `unique`, +//! any item that depend on allocations (see the `use_alloc` feature) +//! and hash maps (like `unique`, `counts`, `into_grouping_map` and more). +//! - `use_alloc` +//! - Enabled by default. +//! - Enables any item that depend on allocations (like `chunk_by`, //! `kmerge`, `join` and many more). //! //! ## Rust Version //! -//! This version of itertools requires Rust 1.32 or later. -#![doc(html_root_url="https://docs.rs/itertools/0.8/")] +//! This version of itertools requires Rust 1.63.0 or later. #[cfg(not(feature = "use_std"))] extern crate core as std; @@ -52,28 +58,26 @@ extern crate core as std; extern crate alloc; #[cfg(feature = "use_alloc")] -use alloc::{ - string::String, - vec::Vec, -}; +use alloc::{collections::VecDeque, string::String, vec::Vec}; pub use either::Either; use core::borrow::Borrow; +use std::cmp::Ordering; #[cfg(feature = "use_std")] use std::collections::HashMap; -use std::iter::{IntoIterator, once}; -use std::cmp::Ordering; -use std::fmt; #[cfg(feature = "use_std")] use std::collections::HashSet; -#[cfg(feature = "use_std")] -use std::hash::Hash; +use std::fmt; #[cfg(feature = "use_alloc")] use std::fmt::Write; +#[cfg(feature = "use_std")] +use std::hash::Hash; +use std::iter::{once, IntoIterator}; +#[cfg(feature = "use_alloc")] +type VecDequeIntoIter = alloc::collections::vec_deque::IntoIter; #[cfg(feature = "use_alloc")] type VecIntoIter = alloc::vec::IntoIter; -#[cfg(feature = "use_alloc")] use std::iter::FromIterator; #[macro_use] @@ -85,72 +89,56 @@ pub use std::iter as __std_iter; /// The concrete iterator types. pub mod structs { - pub use crate::adaptors::{ - Dedup, - DedupBy, - DedupWithCount, - DedupByWithCount, - Interleave, - InterleaveShortest, - FilterMapOk, - FilterOk, - Product, - PutBack, - Batching, - MapInto, - MapOk, - Merge, - MergeBy, - TakeWhileRef, - WhileSome, - Coalesce, - TupleCombinations, - Positions, - Update, - }; - #[allow(deprecated)] - pub use crate::adaptors::{MapResults, Step}; #[cfg(feature = "use_alloc")] pub use crate::adaptors::MultiProduct; + pub use crate::adaptors::{ + Batching, Coalesce, Dedup, DedupBy, DedupByWithCount, DedupWithCount, FilterMapOk, + FilterOk, Interleave, InterleaveShortest, MapInto, MapOk, Positions, Product, PutBack, + TakeWhileRef, TupleCombinations, Update, WhileSome, + }; #[cfg(feature = "use_alloc")] - pub use crate::combinations::Combinations; + pub use crate::combinations::{ArrayCombinations, Combinations}; #[cfg(feature = "use_alloc")] pub use crate::combinations_with_replacement::CombinationsWithReplacement; pub use crate::cons_tuples_impl::ConsTuples; + #[cfg(feature = "use_std")] + pub use crate::duplicates_impl::{Duplicates, DuplicatesBy}; pub use crate::exactly_one_err::ExactlyOneError; - pub use crate::format::{Format, FormatWith}; pub use crate::flatten_ok::FlattenOk; + pub use crate::format::{Format, FormatWith}; + #[allow(deprecated)] + #[cfg(feature = "use_alloc")] + pub use crate::groupbylazy::GroupBy; + #[cfg(feature = "use_alloc")] + pub use crate::groupbylazy::{Chunk, ChunkBy, Chunks, Group, Groups, IntoChunks}; #[cfg(feature = "use_std")] pub use crate::grouping_map::{GroupingMap, GroupingMapBy}; - #[cfg(feature = "use_alloc")] - pub use crate::groupbylazy::{IntoChunks, Chunk, Chunks, GroupBy, Group, Groups}; pub use crate::intersperse::{Intersperse, IntersperseWith}; #[cfg(feature = "use_alloc")] pub use crate::kmerge_impl::{KMerge, KMergeBy}; - pub use crate::merge_join::MergeJoinBy; + pub use crate::merge_join::{Merge, MergeBy, MergeJoinBy}; #[cfg(feature = "use_alloc")] pub use crate::multipeek_impl::MultiPeek; + pub use crate::pad_tail::PadUsing; #[cfg(feature = "use_alloc")] pub use crate::peek_nth::PeekNth; - pub use crate::pad_tail::PadUsing; pub use crate::peeking_take_while::PeekingTakeWhile; #[cfg(feature = "use_alloc")] pub use crate::permutations::Permutations; - pub use crate::process_results_impl::ProcessResults; #[cfg(feature = "use_alloc")] pub use crate::powerset::Powerset; + pub use crate::process_results_impl::ProcessResults; #[cfg(feature = "use_alloc")] pub use crate::put_back_n_impl::PutBackN; #[cfg(feature = "use_alloc")] pub use crate::rciter_impl::RcIter; pub use crate::repeatn::RepeatN; #[allow(deprecated)] - pub use crate::sources::{RepeatCall, Unfold, Iterate}; + pub use crate::sources::{Iterate, Unfold}; + pub use crate::take_while_inclusive::TakeWhileInclusive; #[cfg(feature = "use_alloc")] pub use crate::tee::Tee; - pub use crate::tuple_impl::{TupleBuffer, TupleWindows, CircularTupleWindows, Tuples}; - #[cfg(feature = "use_std")] - pub use crate::duplicates_impl::{Duplicates, DuplicatesBy}; + pub use crate::tuple_impl::{CircularTupleWindows, TupleBuffer, TupleWindows, Tuples}; #[cfg(feature = "use_std")] pub use crate::unique_impl::{Unique, UniqueBy}; pub use crate::with_position::WithPosition; @@ -161,25 +149,26 @@ pub mod structs { /// Traits helpful for using certain `Itertools` methods in generic contexts. pub mod traits { + pub use crate::iter_index::IteratorIndex; pub use crate::tuple_impl::HomogeneousTuple; } -#[allow(deprecated)] -pub use crate::structs::*; pub use crate::concat_impl::concat; pub use crate::cons_tuples_impl::cons_tuples; pub use crate::diff::diff_with; pub use crate::diff::Diff; #[cfg(feature = "use_alloc")] -pub use crate::kmerge_impl::{kmerge_by}; +pub use crate::kmerge_impl::kmerge_by; pub use crate::minmax::MinMaxResult; pub use crate::peeking_take_while::PeekingNext; pub use crate::process_results_impl::process_results; pub use crate::repeatn::repeat_n; #[allow(deprecated)] -pub use crate::sources::{repeat_call, unfold, iterate}; -pub use crate::with_position::Position; +pub use crate::sources::{iterate, unfold}; +#[allow(deprecated)] +pub use crate::structs::*; pub use crate::unziptuple::{multiunzip, MultiUnzip}; +pub use crate::with_position::Position; pub use crate::ziptuple::multizip; mod adaptors; mod either_or_both; @@ -188,25 +177,28 @@ pub use crate::either_or_both::EitherOrBoth; pub mod free; #[doc(inline)] pub use crate::free::*; -mod concat_impl; -mod cons_tuples_impl; #[cfg(feature = "use_alloc")] mod combinations; #[cfg(feature = "use_alloc")] mod combinations_with_replacement; -mod exactly_one_err; +mod concat_impl; +mod cons_tuples_impl; mod diff; -mod flatten_ok; #[cfg(feature = "use_std")] +mod duplicates_impl; +mod exactly_one_err; +#[cfg(feature = "use_alloc")] mod extrema_set; +mod flatten_ok; mod format; -#[cfg(feature = "use_std")] -mod grouping_map; #[cfg(feature = "use_alloc")] mod group_map; #[cfg(feature = "use_alloc")] mod groupbylazy; +#[cfg(feature = "use_std")] +mod grouping_map; mod intersperse; +mod iter_index; #[cfg(feature = "use_alloc")] mod k_smallest; #[cfg(feature = "use_alloc")] @@ -217,6 +209,7 @@ mod merge_join; mod minmax; #[cfg(feature = "use_alloc")] mod multipeek_impl; +mod next_array; mod pad_tail; #[cfg(feature = "use_alloc")] mod peek_nth; @@ -233,12 +226,11 @@ mod rciter_impl; mod repeatn; mod size_hint; mod sources; +mod take_while_inclusive; #[cfg(feature = "use_alloc")] mod tee; mod tuple_impl; #[cfg(feature = "use_std")] -mod duplicates_impl; -#[cfg(feature = "use_std")] mod unique_impl; mod unziptuple; mod with_position; @@ -260,6 +252,7 @@ mod ziptuple; /// // from (0, 0, 0), (0, 0, 1), .., (0, 1, 0), (0, 1, 1), .. etc until (3, 3, 3) /// for (i, j, k) in iproduct!(0..4, 0..4, 0..4) { /// // .. +/// # let _ = (i, j, k); /// } /// # } /// ``` @@ -270,13 +263,22 @@ macro_rules! iproduct { (@flatten $I:expr, $J:expr, $($K:expr,)*) => ( $crate::iproduct!(@flatten $crate::cons_tuples($crate::iproduct!($I, $J)), $($K,)*) ); - ($I:expr) => ( - $crate::__std_iter::IntoIterator::into_iter($I) + () => ( + $crate::__std_iter::once(()) ); - ($I:expr, $J:expr) => ( - $crate::Itertools::cartesian_product($crate::iproduct!($I), $crate::iproduct!($J)) + ($I:expr $(,)?) => ( + $crate::__std_iter::Iterator::map( + $crate::__std_iter::IntoIterator::into_iter($I), + |elt| (elt,) + ) ); - ($I:expr, $J:expr, $($K:expr),+) => ( + ($I:expr, $J:expr $(,)?) => ( + $crate::Itertools::cartesian_product( + $crate::__std_iter::IntoIterator::into_iter($I), + $crate::__std_iter::IntoIterator::into_iter($J), + ) + ); + ($I:expr, $J:expr, $($K:expr),+ $(,)?) => ( $crate::iproduct!(@flatten $crate::iproduct!($I, $J), $($K,)+) ); } @@ -336,19 +338,24 @@ macro_rules! izip { // binary ($first:expr, $second:expr $(,)*) => { - $crate::izip!($first) - .zip($second) + $crate::__std_iter::Iterator::zip( + $crate::__std_iter::IntoIterator::into_iter($first), + $second, + ) }; // n-ary where n > 2 ( $first:expr $( , $rest:expr )* $(,)* ) => { - $crate::izip!($first) + { + let iter = $crate::__std_iter::IntoIterator::into_iter($first); $( - .zip($rest) + let iter = $crate::__std_iter::Iterator::zip(iter, $rest); )* - .map( + $crate::__std_iter::Iterator::map( + iter, $crate::izip!(@closure a => (a) $( , $rest )*) ) + } }; } @@ -373,16 +380,16 @@ macro_rules! izip { /// /// Invocations of `chain!` with one argument expand to [`arg.into_iter()`](IntoIterator): /// ``` -/// use std::{ops::Range, slice}; +/// use std::ops::Range; /// use itertools::chain; -/// let _: as IntoIterator>::IntoIter = chain!((2..6),); // trailing comma optional! +/// let _: as IntoIterator>::IntoIter = chain!(2..6,); // trailing comma optional! /// let _: <&[_] as IntoIterator>::IntoIter = chain!(&[2, 3, 4]); /// ``` /// /// Invocations of `chain!` with multiple arguments [`.into_iter()`](IntoIterator) each /// argument, and then [`chain`] them together: /// ``` -/// use std::{iter::*, ops::Range, slice}; +/// use std::{iter::*, slice}; /// use itertools::{assert_equal, chain}; /// /// // e.g., this: @@ -399,16 +406,16 @@ macro_rules! izip { /// ``` macro_rules! chain { () => { - core::iter::empty() + $crate::__std_iter::empty() }; ($first:expr $(, $rest:expr )* $(,)?) => { { - let iter = core::iter::IntoIterator::into_iter($first); + let iter = $crate::__std_iter::IntoIterator::into_iter($first); $( let iter = - core::iter::Iterator::chain( + $crate::__std_iter::Iterator::chain( iter, - core::iter::IntoIterator::into_iter($rest)); + $crate::__std_iter::IntoIterator::into_iter($rest)); )* iter } @@ -421,14 +428,14 @@ macro_rules! chain { /// This trait defines a number of methods. They are divided into two groups: /// /// * *Adaptors* take an iterator and parameter as input, and return -/// a new iterator value. These are listed first in the trait. An example -/// of an adaptor is [`.interleave()`](Itertools::interleave) +/// a new iterator value. These are listed first in the trait. An example +/// of an adaptor is [`.interleave()`](Itertools::interleave) /// /// * *Regular methods* are those that don't return iterators and instead -/// return a regular value of some other kind. -/// [`.next_tuple()`](Itertools::next_tuple) is an example and the first regular -/// method in the list. -pub trait Itertools : Iterator { +/// return a regular value of some other kind. +/// [`.next_tuple()`](Itertools::next_tuple) is an example and the first regular +/// method in the list. +pub trait Itertools: Iterator { // adaptors /// Alternate elements from two iterators until both have run out. @@ -444,8 +451,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3, 4, 5, 6]); /// ``` fn interleave(self, other: J) -> Interleave - where J: IntoIterator, - Self: Sized + where + J: IntoIterator, + Self: Sized, { interleave(self, other) } @@ -462,8 +470,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3]); /// ``` fn interleave_shortest(self, other: J) -> InterleaveShortest - where J: IntoIterator, - Self: Sized + where + J: IntoIterator, + Self: Sized, { adaptors::interleave_shortest(self, other.into_iter()) } @@ -481,8 +490,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal((0..3).intersperse(8), vec![0, 8, 1, 8, 2]); /// ``` fn intersperse(self, element: Self::Item) -> Intersperse - where Self: Sized, - Self::Item: Clone + where + Self: Sized, + Self::Item: Clone, { intersperse::intersperse(self, element) } @@ -502,12 +512,63 @@ pub trait Itertools : Iterator { /// assert_eq!(i, 8); /// ``` fn intersperse_with(self, element: F) -> IntersperseWith - where Self: Sized, - F: FnMut() -> Self::Item + where + Self: Sized, + F: FnMut() -> Self::Item, { intersperse::intersperse_with(self, element) } + /// Returns an iterator over a subsection of the iterator. + /// + /// Works similarly to [`slice::get`](https://doc.rust-lang.org/std/primitive.slice.html#method.get). + /// + /// **Panics** for ranges `..=usize::MAX` and `0..=usize::MAX`. + /// + /// It's a generalisation of [`Iterator::take`] and [`Iterator::skip`], + /// and uses these under the hood. + /// Therefore, the resulting iterator is: + /// - [`ExactSizeIterator`] if the adapted iterator is [`ExactSizeIterator`]. + /// - [`DoubleEndedIterator`] if the adapted iterator is [`DoubleEndedIterator`] and [`ExactSizeIterator`]. + /// + /// # Unspecified Behavior + /// The result of indexing with an exhausted [`core::ops::RangeInclusive`] is unspecified. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let vec = vec![3, 1, 4, 1, 5]; + /// + /// let mut range: Vec<_> = + /// vec.iter().get(1..=3).copied().collect(); + /// assert_eq!(&range, &[1, 4, 1]); + /// + /// // It works with other types of ranges, too + /// range = vec.iter().get(..2).copied().collect(); + /// assert_eq!(&range, &[3, 1]); + /// + /// range = vec.iter().get(0..1).copied().collect(); + /// assert_eq!(&range, &[3]); + /// + /// range = vec.iter().get(2..).copied().collect(); + /// assert_eq!(&range, &[4, 1, 5]); + /// + /// range = vec.iter().get(..=2).copied().collect(); + /// assert_eq!(&range, &[3, 1, 4]); + /// + /// range = vec.iter().get(..).copied().collect(); + /// assert_eq!(range, vec); + /// ``` + fn get(self, index: R) -> R::Output + where + Self: Sized, + R: traits::IteratorIndex, + { + iter_index::get(self, index) + } + /// Create an iterator which iterates over both this and the specified /// iterator simultaneously, yielding pairs of two optional elements. /// @@ -536,8 +597,9 @@ pub trait Itertools : Iterator { /// ``` #[inline] fn zip_longest(self, other: J) -> ZipLongest - where J: IntoIterator, - Self: Sized + where + J: IntoIterator, + Self: Sized, { zip_longest::zip_longest(self, other.into_iter()) } @@ -549,8 +611,9 @@ pub trait Itertools : Iterator { /// lengths. #[inline] fn zip_eq(self, other: J) -> ZipEq - where J: IntoIterator, - Self: Sized + where + J: IntoIterator, + Self: Sized, { zip_eq(self, other) } @@ -579,8 +642,9 @@ pub trait Itertools : Iterator { /// ``` /// fn batching(self, f: F) -> Batching - where F: FnMut(&mut Self) -> Option, - Self: Sized + where + F: FnMut(&mut Self) -> Option, + Self: Sized, { adaptors::batching(self, f) } @@ -589,10 +653,10 @@ pub trait Itertools : Iterator { /// Consecutive elements that map to the same key (“runs”), are assigned /// to the same group. /// - /// `GroupBy` is the storage for the lazy grouping operation. + /// `ChunkBy` is the storage for the lazy grouping operation. /// /// If the groups are consumed in order, or if each group's iterator is - /// dropped without keeping it around, then `GroupBy` uses no + /// dropped without keeping it around, then `ChunkBy` uses no /// allocations. It needs allocations only if several group iterators /// are alive at the same time. /// @@ -607,34 +671,47 @@ pub trait Itertools : Iterator { /// ``` /// use itertools::Itertools; /// - /// // group data into runs of larger than zero or not. + /// // chunk data into runs of larger than zero or not. /// let data = vec![1, 3, -2, -2, 1, 0, 1, 2]; - /// // groups: |---->|------>|--------->| + /// // chunks: |---->|------>|--------->| /// - /// // Note: The `&` is significant here, `GroupBy` is iterable + /// // Note: The `&` is significant here, `ChunkBy` is iterable /// // only by reference. You can also call `.into_iter()` explicitly. /// let mut data_grouped = Vec::new(); - /// for (key, group) in &data.into_iter().group_by(|elt| *elt >= 0) { - /// data_grouped.push((key, group.collect())); + /// for (key, chunk) in &data.into_iter().chunk_by(|elt| *elt >= 0) { + /// data_grouped.push((key, chunk.collect())); /// } /// assert_eq!(data_grouped, vec![(true, vec![1, 3]), (false, vec![-2, -2]), (true, vec![1, 0, 1, 2])]); /// ``` #[cfg(feature = "use_alloc")] - fn group_by(self, key: F) -> GroupBy - where Self: Sized, - F: FnMut(&Self::Item) -> K, - K: PartialEq, + fn chunk_by(self, key: F) -> ChunkBy + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: PartialEq, { groupbylazy::new(self, key) } + /// See [`.chunk_by()`](Itertools::chunk_by). + #[deprecated(note = "Use .chunk_by() instead", since = "0.13.0")] + #[cfg(feature = "use_alloc")] + fn group_by(self, key: F) -> ChunkBy + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: PartialEq, + { + self.chunk_by(key) + } + /// Return an *iterable* that can chunk the iterator. /// /// Yield subiterators (chunks) that each yield a fixed number elements, /// determined by `size`. The last chunk will be shorter if there aren't /// enough elements. /// - /// `IntoChunks` is based on `GroupBy`: it is iterable (implements + /// `IntoChunks` is based on `ChunkBy`: it is iterable (implements /// `IntoIterator`, **not** `Iterator`), and it only buffers if several /// chunk iterators are alive at the same time. /// @@ -657,7 +734,8 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn chunks(self, size: usize) -> IntoChunks - where Self: Sized, + where + Self: Sized, { assert!(size != 0); groupbylazy::new_chunks(self, size) @@ -697,9 +775,10 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4)]); /// ``` fn tuple_windows(self) -> TupleWindows - where Self: Sized + Iterator, - T: traits::HomogeneousTuple, - T::Item: Clone + where + Self: Sized + Iterator, + T: traits::HomogeneousTuple, + T::Item: Clone, { tuple_impl::tuple_windows(self) } @@ -732,9 +811,10 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4), (3, 4, 1), (4, 1, 2)]); /// ``` fn circular_tuple_windows(self) -> CircularTupleWindows - where Self: Sized + Clone + Iterator + ExactSizeIterator, - T: tuple_impl::TupleCollect + Clone, - T::Item: Clone + where + Self: Sized + Clone + Iterator + ExactSizeIterator, + T: tuple_impl::TupleCollect + Clone, + T::Item: Clone, { tuple_impl::circular_tuple_windows(self) } @@ -770,8 +850,9 @@ pub trait Itertools : Iterator { /// /// See also [`Tuples::into_buffer`]. fn tuples(self) -> Tuples - where Self: Sized + Iterator, - T: traits::HomogeneousTuple + where + Self: Sized + Iterator, + T: traits::HomogeneousTuple, { tuple_impl::tuples(self) } @@ -795,36 +876,13 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn tee(self) -> (Tee, Tee) - where Self: Sized, - Self::Item: Clone + where + Self: Sized, + Self::Item: Clone, { tee::new(self) } - /// Return an iterator adaptor that steps `n` elements in the base iterator - /// for each iteration. - /// - /// The iterator steps by yielding the next element from the base iterator, - /// then skipping forward `n - 1` elements. - /// - /// Iterator element type is `Self::Item`. - /// - /// **Panics** if the step is 0. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let it = (0..8).step(3); - /// itertools::assert_equal(it, vec![0, 3, 6]); - /// ``` - #[deprecated(note="Use std .step_by() instead", since="0.8.0")] - #[allow(deprecated)] - fn step(self, n: usize) -> Step - where Self: Sized - { - adaptors::step(self, n) - } - /// Convert each item of the iterator using the [`Into`] trait. /// /// ```rust @@ -833,21 +891,13 @@ pub trait Itertools : Iterator { /// (1i32..42i32).map_into::().collect_vec(); /// ``` fn map_into(self) -> MapInto - where Self: Sized, - Self::Item: Into, + where + Self: Sized, + Self::Item: Into, { adaptors::map_into(self) } - /// See [`.map_ok()`](Itertools::map_ok). - #[deprecated(note="Use .map_ok() instead", since="0.10.0")] - fn map_results(self, f: F) -> MapOk - where Self: Iterator> + Sized, - F: FnMut(T) -> U, - { - self.map_ok(f) - } - /// Return an iterator adaptor that applies the provided closure /// to every `Result::Ok` value. `Result::Err` values are /// unchanged. @@ -860,8 +910,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![Ok(42), Err(false), Ok(12)]); /// ``` fn map_ok(self, f: F) -> MapOk - where Self: Iterator> + Sized, - F: FnMut(T) -> U, + where + Self: Iterator> + Sized, + F: FnMut(T) -> U, { adaptors::map_ok(self, f) } @@ -878,8 +929,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![Ok(22), Err(false)]); /// ``` fn filter_ok(self, f: F) -> FilterOk - where Self: Iterator> + Sized, - F: FnMut(&T) -> bool, + where + Self: Iterator> + Sized, + F: FnMut(&T) -> bool, { adaptors::filter_ok(self, f) } @@ -896,15 +948,16 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![Ok(44), Err(false)]); /// ``` fn filter_map_ok(self, f: F) -> FilterMapOk - where Self: Iterator> + Sized, - F: FnMut(T) -> Option, + where + Self: Iterator> + Sized, + F: FnMut(T) -> Option, { adaptors::filter_map_ok(self, f) } /// Return an iterator adaptor that flattens every `Result::Ok` value into /// a series of `Result::Ok` values. `Result::Err` values are unchanged. - /// + /// /// This is useful when you have some common error type for your crate and /// need to propagate it upwards, but the `Result::Ok` case needs to be flattened. /// @@ -914,18 +967,57 @@ pub trait Itertools : Iterator { /// let input = vec![Ok(0..2), Err(false), Ok(2..4)]; /// let it = input.iter().cloned().flatten_ok(); /// itertools::assert_equal(it.clone(), vec![Ok(0), Ok(1), Err(false), Ok(2), Ok(3)]); - /// + /// /// // This can also be used to propagate errors when collecting. /// let output_result: Result, bool> = it.collect(); /// assert_eq!(output_result, Err(false)); /// ``` fn flatten_ok(self) -> FlattenOk - where Self: Iterator> + Sized, - T: IntoIterator + where + Self: Iterator> + Sized, + T: IntoIterator, { flatten_ok::flatten_ok(self) } + /// “Lift” a function of the values of the current iterator so as to process + /// an iterator of `Result` values instead. + /// + /// `processor` is a closure that receives an adapted version of the iterator + /// as the only argument — the adapted iterator produces elements of type `T`, + /// as long as the original iterator produces `Ok` values. + /// + /// If the original iterable produces an error at any point, the adapted + /// iterator ends and it will return the error iself. + /// + /// Otherwise, the return value from the closure is returned wrapped + /// inside `Ok`. + /// + /// # Example + /// + /// ``` + /// use itertools::Itertools; + /// + /// type Item = Result; + /// + /// let first_values: Vec = vec![Ok(1), Ok(0), Ok(3)]; + /// let second_values: Vec = vec![Ok(2), Ok(1), Err("overflow")]; + /// + /// // “Lift” the iterator .max() method to work on the Ok-values. + /// let first_max = first_values.into_iter().process_results(|iter| iter.max().unwrap_or(0)); + /// let second_max = second_values.into_iter().process_results(|iter| iter.max().unwrap_or(0)); + /// + /// assert_eq!(first_max, Ok(3)); + /// assert!(second_max.is_err()); + /// ``` + fn process_results(self, processor: F) -> Result + where + Self: Iterator> + Sized, + F: FnOnce(ProcessResults) -> R, + { + process_results(self, processor) + } + /// Return an iterator adaptor that merges the two base iterators in /// ascending order. If both base iterators are sorted (ascending), the /// result is sorted. @@ -935,15 +1027,16 @@ pub trait Itertools : Iterator { /// ``` /// use itertools::Itertools; /// - /// let a = (0..11).step(3); - /// let b = (0..11).step(5); + /// let a = (0..11).step_by(3); + /// let b = (0..11).step_by(5); /// let it = a.merge(b); /// itertools::assert_equal(it, vec![0, 0, 3, 5, 6, 9, 10]); /// ``` fn merge(self, other: J) -> Merge - where Self: Sized, - Self::Item: PartialOrd, - J: IntoIterator + where + Self: Sized, + Self::Item: PartialOrd, + J: IntoIterator, { merge(self, other) } @@ -963,19 +1056,22 @@ pub trait Itertools : Iterator { /// let it = a.merge_by(b, |x, y| x.1 <= y.1); /// itertools::assert_equal(it, vec![(0, 'a'), (0, 'b'), (1, 'c'), (1, 'd')]); /// ``` - fn merge_by(self, other: J, is_first: F) -> MergeBy - where Self: Sized, - J: IntoIterator, - F: FnMut(&Self::Item, &Self::Item) -> bool + where + Self: Sized, + J: IntoIterator, + F: FnMut(&Self::Item, &Self::Item) -> bool, { - adaptors::merge_by_new(self, other.into_iter(), is_first) + merge_join::merge_by_new(self, other, is_first) } /// Create an iterator that merges items from both this and the specified /// iterator in ascending order. /// - /// It chooses whether to pair elements based on the `Ordering` returned by the + /// The function can either return an `Ordering` variant or a boolean. + /// + /// If `cmp_fn` returns `Ordering`, + /// it chooses whether to pair elements based on the `Ordering` returned by the /// specified compare function. At any point, inspecting the tip of the /// iterators `I` and `J` as items `i` of type `I::Item` and `j` of type /// `J::Item` respectively, the resulting iterator will: @@ -991,19 +1087,50 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// use itertools::EitherOrBoth::{Left, Right, Both}; /// - /// let multiples_of_2 = (0..10).step(2); - /// let multiples_of_3 = (0..10).step(3); + /// let a = vec![0, 2, 4, 6, 1].into_iter(); + /// let b = (0..10).step_by(3); /// /// itertools::assert_equal( - /// multiples_of_2.merge_join_by(multiples_of_3, |i, j| i.cmp(j)), - /// vec![Both(0, 0), Left(2), Right(3), Left(4), Both(6, 6), Left(8), Right(9)] + /// // This performs a diff in the style of the Unix command comm(1), + /// // generalized to arbitrary types rather than text. + /// a.merge_join_by(b, Ord::cmp), + /// vec![Both(0, 0), Left(2), Right(3), Left(4), Both(6, 6), Left(1), Right(9)] + /// ); + /// ``` + /// + /// If `cmp_fn` returns `bool`, + /// it chooses whether to pair elements based on the boolean returned by the + /// specified function. At any point, inspecting the tip of the + /// iterators `I` and `J` as items `i` of type `I::Item` and `j` of type + /// `J::Item` respectively, the resulting iterator will: + /// + /// - Emit `Either::Left(i)` when `true`, + /// and remove `i` from its source iterator + /// - Emit `Either::Right(j)` when `false`, + /// and remove `j` from its source iterator + /// + /// It is similar to the `Ordering` case if the first argument is considered + /// "less" than the second argument. + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::Either::{Left, Right}; + /// + /// let a = vec![0, 2, 4, 6, 1].into_iter(); + /// let b = (0..10).step_by(3); + /// + /// itertools::assert_equal( + /// a.merge_join_by(b, |i, j| i <= j), + /// vec![Left(0), Right(0), Left(2), Right(3), Left(4), Left(6), Left(1), Right(6), Right(9)] /// ); /// ``` #[inline] - fn merge_join_by(self, other: J, cmp_fn: F) -> MergeJoinBy - where J: IntoIterator, - F: FnMut(&Self::Item, &J::Item) -> std::cmp::Ordering, - Self: Sized + #[doc(alias = "comm")] + fn merge_join_by(self, other: J, cmp_fn: F) -> MergeJoinBy + where + J: IntoIterator, + F: FnMut(&Self::Item, &J::Item) -> T, + Self: Sized, { merge_join_by(self, other, cmp_fn) } @@ -1018,17 +1145,18 @@ pub trait Itertools : Iterator { /// ``` /// use itertools::Itertools; /// - /// let a = (0..6).step(3); - /// let b = (1..6).step(3); - /// let c = (2..6).step(3); + /// let a = (0..6).step_by(3); + /// let b = (1..6).step_by(3); + /// let c = (2..6).step_by(3); /// let it = vec![a, b, c].into_iter().kmerge(); /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5]); /// ``` #[cfg(feature = "use_alloc")] fn kmerge(self) -> KMerge<::IntoIter> - where Self: Sized, - Self::Item: IntoIterator, - ::Item: PartialOrd, + where + Self: Sized, + Self::Item: IntoIterator, + ::Item: PartialOrd, { kmerge(self) } @@ -1054,12 +1182,11 @@ pub trait Itertools : Iterator { /// assert_eq!(it.last(), Some(-7.)); /// ``` #[cfg(feature = "use_alloc")] - fn kmerge_by(self, first: F) - -> KMergeBy<::IntoIter, F> - where Self: Sized, - Self::Item: IntoIterator, - F: FnMut(&::Item, - &::Item) -> bool + fn kmerge_by(self, first: F) -> KMergeBy<::IntoIter, F> + where + Self: Sized, + Self::Item: IntoIterator, + F: FnMut(&::Item, &::Item) -> bool, { kmerge_by(self, first) } @@ -1076,10 +1203,11 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![(0, 'α'), (0, 'β'), (1, 'α'), (1, 'β')]); /// ``` fn cartesian_product(self, other: J) -> Product - where Self: Sized, - Self::Item: Clone, - J: IntoIterator, - J::IntoIter: Clone + where + Self: Sized, + Self::Item: Clone, + J: IntoIterator, + J::IntoIter: Clone, { adaptors::cartesian_product(self, other.into_iter()) } @@ -1091,10 +1219,11 @@ pub trait Itertools : Iterator { /// the product of iterators yielding multiple types, use the /// [`iproduct`] macro instead. /// - /// /// The iterator element type is `Vec`, where `T` is the iterator element /// of the subiterators. /// + /// Note that the iterator is fused. + /// /// ``` /// use itertools::Itertools; /// let mut multi_prod = (0..3).map(|i| (i * 2)..(i * 2 + 2)) @@ -1109,12 +1238,23 @@ pub trait Itertools : Iterator { /// assert_eq!(multi_prod.next(), Some(vec![1, 3, 5])); /// assert_eq!(multi_prod.next(), None); /// ``` + /// + /// If the adapted iterator is empty, the result is an iterator yielding a single empty vector. + /// This is known as the [nullary cartesian product](https://en.wikipedia.org/wiki/Empty_product#Nullary_Cartesian_product). + /// + /// ``` + /// use itertools::Itertools; + /// let mut nullary_cartesian_product = (0..0).map(|i| (i * 2)..(i * 2 + 2)).multi_cartesian_product(); + /// assert_eq!(nullary_cartesian_product.next(), Some(vec![])); + /// assert_eq!(nullary_cartesian_product.next(), None); + /// ``` #[cfg(feature = "use_alloc")] fn multi_cartesian_product(self) -> MultiProduct<::IntoIter> - where Self: Sized, - Self::Item: IntoIterator, - ::IntoIter: Clone, - ::Item: Clone + where + Self: Sized, + Self::Item: IntoIterator, + ::IntoIter: Clone, + ::Item: Clone, { adaptors::multi_cartesian_product(self) } @@ -1148,9 +1288,9 @@ pub trait Itertools : Iterator { /// vec![-6., 4., -1.]); /// ``` fn coalesce(self, f: F) -> Coalesce - where Self: Sized, - F: FnMut(Self::Item, Self::Item) - -> Result + where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Result, { adaptors::coalesce(self, f) } @@ -1170,8 +1310,9 @@ pub trait Itertools : Iterator { /// vec![1., 2., 3., 2.]); /// ``` fn dedup(self) -> Dedup - where Self: Sized, - Self::Item: PartialEq, + where + Self: Sized, + Self::Item: PartialEq, { adaptors::dedup(self) } @@ -1192,8 +1333,9 @@ pub trait Itertools : Iterator { /// vec![(0, 1.), (0, 2.), (0, 3.), (1, 2.)]); /// ``` fn dedup_by(self, cmp: Cmp) -> DedupBy - where Self: Sized, - Cmp: FnMut(&Self::Item, &Self::Item)->bool, + where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool, { adaptors::dedup_by(self, cmp) } @@ -1260,8 +1402,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn duplicates(self) -> Duplicates - where Self: Sized, - Self::Item: Eq + Hash + where + Self: Sized, + Self::Item: Eq + Hash, { duplicates_impl::duplicates(self) } @@ -1285,9 +1428,10 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn duplicates_by(self, f: F) -> DuplicatesBy - where Self: Sized, - V: Eq + Hash, - F: FnMut(&Self::Item) -> V + where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V, { duplicates_impl::duplicates_by(self, f) } @@ -1312,8 +1456,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn unique(self) -> Unique - where Self: Sized, - Self::Item: Clone + Eq + Hash + where + Self: Sized, + Self::Item: Clone + Eq + Hash, { unique_impl::unique(self) } @@ -1338,9 +1483,10 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn unique_by(self, f: F) -> UniqueBy - where Self: Sized, - V: Eq + Hash, - F: FnMut(&Self::Item) -> V + where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V, { unique_impl::unique_by(self, f) } @@ -1358,8 +1504,9 @@ pub trait Itertools : Iterator { /// See also [`.take_while_ref()`](Itertools::take_while_ref) /// which is a similar adaptor. fn peeking_take_while(&mut self, accept: F) -> PeekingTakeWhile - where Self: Sized + PeekingNext, - F: FnMut(&Self::Item) -> bool, + where + Self: Sized + PeekingNext, + F: FnMut(&Self::Item) -> bool, { peeking_take_while::peeking_take_while(self, accept) } @@ -1383,12 +1530,82 @@ pub trait Itertools : Iterator { /// /// ``` fn take_while_ref(&mut self, accept: F) -> TakeWhileRef - where Self: Clone, - F: FnMut(&Self::Item) -> bool + where + Self: Clone, + F: FnMut(&Self::Item) -> bool, { adaptors::take_while_ref(self, accept) } + /// Returns an iterator adaptor that consumes elements while the given + /// predicate is `true`, *including* the element for which the predicate + /// first returned `false`. + /// + /// The [`.take_while()`][std::iter::Iterator::take_while] adaptor is useful + /// when you want items satisfying a predicate, but to know when to stop + /// taking elements, we have to consume that first element that doesn't + /// satisfy the predicate. This adaptor includes that element where + /// [`.take_while()`][std::iter::Iterator::take_while] would drop it. + /// + /// The [`.take_while_ref()`][crate::Itertools::take_while_ref] adaptor + /// serves a similar purpose, but this adaptor doesn't require [`Clone`]ing + /// the underlying elements. + /// + /// ```rust + /// # use itertools::Itertools; + /// let items = vec![1, 2, 3, 4, 5]; + /// let filtered: Vec<_> = items + /// .into_iter() + /// .take_while_inclusive(|&n| n % 3 != 0) + /// .collect(); + /// + /// assert_eq!(filtered, vec![1, 2, 3]); + /// ``` + /// + /// ```rust + /// # use itertools::Itertools; + /// let items = vec![1, 2, 3, 4, 5]; + /// + /// let take_while_inclusive_result: Vec<_> = items + /// .iter() + /// .copied() + /// .take_while_inclusive(|&n| n % 3 != 0) + /// .collect(); + /// let take_while_result: Vec<_> = items + /// .into_iter() + /// .take_while(|&n| n % 3 != 0) + /// .collect(); + /// + /// assert_eq!(take_while_inclusive_result, vec![1, 2, 3]); + /// assert_eq!(take_while_result, vec![1, 2]); + /// // both iterators have the same items remaining at this point---the 3 + /// // is lost from the `take_while` vec + /// ``` + /// + /// ```rust + /// # use itertools::Itertools; + /// #[derive(Debug, PartialEq)] + /// struct NoCloneImpl(i32); + /// + /// let non_clonable_items: Vec<_> = vec![1, 2, 3, 4, 5] + /// .into_iter() + /// .map(NoCloneImpl) + /// .collect(); + /// let filtered: Vec<_> = non_clonable_items + /// .into_iter() + /// .take_while_inclusive(|n| n.0 % 3 != 0) + /// .collect(); + /// let expected: Vec<_> = vec![1, 2, 3].into_iter().map(NoCloneImpl).collect(); + /// assert_eq!(filtered, expected); + #[doc(alias = "take_until")] + fn take_while_inclusive(self, accept: F) -> TakeWhileInclusive + where + Self: Sized, + F: FnMut(&Self::Item) -> bool, + { + take_while_inclusive::TakeWhileInclusive::new(self, accept) + } + /// Return an iterator adaptor that filters `Option` iterator elements /// and produces `A`. Stops on the first `None` encountered. /// @@ -1404,7 +1621,8 @@ pub trait Itertools : Iterator { /// /// ``` fn while_some(self) -> WhileSome - where Self: Sized + Iterator> + where + Self: Sized + Iterator>, { adaptors::while_some(self) } @@ -1415,6 +1633,11 @@ pub trait Itertools : Iterator { /// Iterator element can be any homogeneous tuple of type `Self::Item` with /// size up to 12. /// + /// # Guarantees + /// + /// If the adapted iterator is deterministic, + /// this iterator adapter yields items in a reliable order. + /// /// ``` /// use itertools::Itertools; /// @@ -1443,19 +1666,72 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]); /// ``` fn tuple_combinations(self) -> TupleCombinations - where Self: Sized + Clone, - Self::Item: Clone, - T: adaptors::HasCombination, + where + Self: Sized + Clone, + Self::Item: Clone, + T: adaptors::HasCombination, { adaptors::tuple_combinations(self) } + /// Return an iterator adaptor that iterates over the combinations of the + /// elements from an iterator. + /// + /// Iterator element type is [Self::Item; K]. The iterator produces a new + /// array per iteration, and clones the iterator elements. + /// + /// # Guarantees + /// + /// If the adapted iterator is deterministic, + /// this iterator adapter yields items in a reliable order. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut v = Vec::new(); + /// for [a, b] in (1..5).array_combinations() { + /// v.push([a, b]); + /// } + /// assert_eq!(v, vec![[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]); + /// + /// let mut it = (1..5).array_combinations(); + /// assert_eq!(Some([1, 2, 3]), it.next()); + /// assert_eq!(Some([1, 2, 4]), it.next()); + /// assert_eq!(Some([1, 3, 4]), it.next()); + /// assert_eq!(Some([2, 3, 4]), it.next()); + /// assert_eq!(None, it.next()); + /// + /// // this requires a type hint + /// let it = (1..5).array_combinations::<3>(); + /// itertools::assert_equal(it, vec![[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]); + /// + /// // you can also specify the complete type + /// use itertools::ArrayCombinations; + /// use std::ops::Range; + /// + /// let it: ArrayCombinations, 3> = (1..5).array_combinations(); + /// itertools::assert_equal(it, vec![[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]); + /// ``` + #[cfg(feature = "use_alloc")] + fn array_combinations(self) -> ArrayCombinations + where + Self: Sized + Clone, + Self::Item: Clone, + { + combinations::array_combinations(self) + } + /// Return an iterator adaptor that iterates over the `k`-length combinations of /// the elements from an iterator. /// - /// Iterator element type is `Vec`. The iterator produces a new Vec per iteration, + /// Iterator element type is `Vec`. The iterator produces a new `Vec` per iteration, /// and clones the iterator elements. /// + /// # Guarantees + /// + /// If the adapted iterator is deterministic, + /// this iterator adapter yields items in a reliable order. + /// /// ``` /// use itertools::Itertools; /// @@ -1481,8 +1757,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn combinations(self, k: usize) -> Combinations - where Self: Sized, - Self::Item: Clone + where + Self: Sized, + Self::Item: Clone, { combinations::combinations(self, k) } @@ -1490,7 +1767,7 @@ pub trait Itertools : Iterator { /// Return an iterator that iterates over the `k`-length combinations of /// the elements from an iterator, with replacement. /// - /// Iterator element type is `Vec`. The iterator produces a new Vec per iteration, + /// Iterator element type is `Vec`. The iterator produces a new `Vec` per iteration, /// and clones the iterator elements. /// /// ``` @@ -1519,11 +1796,14 @@ pub trait Itertools : Iterator { /// elements from an iterator. /// /// Iterator element type is `Vec` with length `k`. The iterator - /// produces a new Vec per iteration, and clones the iterator elements. + /// produces a new `Vec` per iteration, and clones the iterator elements. /// /// If `k` is greater than the length of the input iterator, the resultant /// iterator adaptor will be empty. /// + /// If you are looking for permutations with replacements, + /// use `repeat_n(iter, k).multi_cartesian_product()` instead. + /// /// ``` /// use itertools::Itertools; /// @@ -1554,8 +1834,9 @@ pub trait Itertools : Iterator { /// re-iterated if the permutations adaptor is completed and re-iterated. #[cfg(feature = "use_alloc")] fn permutations(self, k: usize) -> Permutations - where Self: Sized, - Self::Item: Clone + where + Self: Sized, + Self::Item: Clone, { permutations::permutations(self, k) } @@ -1590,8 +1871,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn powerset(self) -> Powerset - where Self: Sized, - Self::Item: Clone, + where + Self: Sized, + Self::Item: Clone, { powerset::powerset(self) } @@ -1614,33 +1896,35 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![18, 16, 14, 12, 10, 4, 3, 2, 1, 0]); /// ``` fn pad_using(self, min: usize, f: F) -> PadUsing - where Self: Sized, - F: FnMut(usize) -> Self::Item + where + Self: Sized, + F: FnMut(usize) -> Self::Item, { pad_tail::pad_using(self, min, f) } - /// Return an iterator adaptor that wraps each element in a `Position` to + /// Return an iterator adaptor that combines each element with a `Position` to /// ease special-case handling of the first or last elements. /// /// Iterator element type is - /// [`Position`](Position) + /// [`(Position, Self::Item)`](Position) /// /// ``` /// use itertools::{Itertools, Position}; /// /// let it = (0..4).with_position(); /// itertools::assert_equal(it, - /// vec![Position::First(0), - /// Position::Middle(1), - /// Position::Middle(2), - /// Position::Last(3)]); + /// vec![(Position::First, 0), + /// (Position::Middle, 1), + /// (Position::Middle, 2), + /// (Position::Last, 3)]); /// /// let it = (0..1).with_position(); - /// itertools::assert_equal(it, vec![Position::Only(0)]); + /// itertools::assert_equal(it, vec![(Position::Only, 0)]); /// ``` fn with_position(self) -> WithPosition - where Self: Sized, + where + Self: Sized, { with_position::with_position(self) } @@ -1648,7 +1932,7 @@ pub trait Itertools : Iterator { /// Return an iterator adaptor that yields the indices of all elements /// satisfying a predicate, counted from the start of the iterator. /// - /// Equivalent to `iter.enumerate().filter(|(_, v)| predicate(v)).map(|(i, _)| i)`. + /// Equivalent to `iter.enumerate().filter(|(_, v)| predicate(*v)).map(|(i, _)| i)`. /// /// ``` /// use itertools::Itertools; @@ -1659,8 +1943,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(data.iter().positions(|v| v % 2 == 1).rev(), vec![7, 6, 3, 2, 0]); /// ``` fn positions

    (self, predicate: P) -> Positions - where Self: Sized, - P: FnMut(Self::Item) -> bool, + where + Self: Sized, + P: FnMut(Self::Item) -> bool, { adaptors::positions(self, predicate) } @@ -1672,17 +1957,62 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// /// let input = vec![vec![1], vec![3, 2, 1]]; - /// let it = input.into_iter().update(|mut v| v.push(0)); + /// let it = input.into_iter().update(|v| v.push(0)); /// itertools::assert_equal(it, vec![vec![1, 0], vec![3, 2, 1, 0]]); /// ``` fn update(self, updater: F) -> Update - where Self: Sized, - F: FnMut(&mut Self::Item), + where + Self: Sized, + F: FnMut(&mut Self::Item), { adaptors::update(self, updater) } // non-adaptor methods + /// Advances the iterator and returns the next items grouped in an array of + /// a specific size. + /// + /// If there are enough elements to be grouped in an array, then the array + /// is returned inside `Some`, otherwise `None` is returned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut iter = 1..5; + /// + /// assert_eq!(Some([1, 2]), iter.next_array()); + /// ``` + fn next_array(&mut self) -> Option<[Self::Item; N]> + where + Self: Sized, + { + next_array::next_array(self) + } + + /// Collects all items from the iterator into an array of a specific size. + /// + /// If the number of elements inside the iterator is **exactly** equal to + /// the array size, then the array is returned inside `Some`, otherwise + /// `None` is returned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let iter = 1..3; + /// + /// if let Some([x, y]) = iter.collect_array() { + /// assert_eq!([x, y], [1, 2]) + /// } else { + /// panic!("Expected two elements") + /// } + /// ``` + fn collect_array(mut self) -> Option<[Self::Item; N]> + where + Self: Sized, + { + self.next_array().filter(|_| self.next().is_none()) + } + /// Advances the iterator and returns the next items grouped in a tuple of /// a specific size (up to 12). /// @@ -1697,8 +2027,9 @@ pub trait Itertools : Iterator { /// assert_eq!(Some((1, 2)), iter.next_tuple()); /// ``` fn next_tuple(&mut self) -> Option - where Self: Sized + Iterator, - T: traits::HomogeneousTuple + where + Self: Sized + Iterator, + T: traits::HomogeneousTuple, { T::collect_from_iter_no_buf(self) } @@ -1722,19 +2053,19 @@ pub trait Itertools : Iterator { /// } /// ``` fn collect_tuple(mut self) -> Option - where Self: Sized + Iterator, - T: traits::HomogeneousTuple + where + Self: Sized + Iterator, + T: traits::HomogeneousTuple, { match self.next_tuple() { elt @ Some(_) => match self.next() { Some(_) => None, None => elt, }, - _ => None + _ => None, } } - /// Find the position and value of the first element satisfying a predicate. /// /// The iterator is not advanced past the first element found. @@ -1746,14 +2077,10 @@ pub trait Itertools : Iterator { /// assert_eq!(text.chars().find_position(|ch| ch.is_lowercase()), Some((1, 'α'))); /// ``` fn find_position

    (&mut self, mut pred: P) -> Option<(usize, Self::Item)> - where P: FnMut(&Self::Item) -> bool + where + P: FnMut(&Self::Item) -> bool, { - for (index, elt) in self.enumerate() { - if pred(&elt) { - return Some((index, elt)); - } - } - None + self.enumerate().find(|(_, elt)| pred(elt)) } /// Find the value of the first element satisfying a predicate or return the last element, if any. /// @@ -1766,14 +2093,31 @@ pub trait Itertools : Iterator { /// assert_eq!(numbers.iter().find_or_last(|&&x| x > 5), Some(&4)); /// assert_eq!(numbers.iter().find_or_last(|&&x| x > 2), Some(&3)); /// assert_eq!(std::iter::empty::().find_or_last(|&x| x > 5), None); + /// + /// // An iterator of Results can return the first Ok or the last Err: + /// let input = vec![Err(()), Ok(11), Err(()), Ok(22)]; + /// assert_eq!(input.into_iter().find_or_last(Result::is_ok), Some(Ok(11))); + /// + /// let input: Vec> = vec![Err(11), Err(22)]; + /// assert_eq!(input.into_iter().find_or_last(Result::is_ok), Some(Err(22))); + /// + /// assert_eq!(std::iter::empty::>().find_or_last(Result::is_ok), None); /// ``` fn find_or_last

    (mut self, mut predicate: P) -> Option - where Self: Sized, - P: FnMut(&Self::Item) -> bool, + where + Self: Sized, + P: FnMut(&Self::Item) -> bool, { let mut prev = None; - self.find_map(|x| if predicate(&x) { Some(x) } else { prev = Some(x); None }) - .or(prev) + self.find_map(|x| { + if predicate(&x) { + Some(x) + } else { + prev = Some(x); + None + } + }) + .or(prev) } /// Find the value of the first element satisfying a predicate or return the first element, if any. /// @@ -1786,10 +2130,20 @@ pub trait Itertools : Iterator { /// assert_eq!(numbers.iter().find_or_first(|&&x| x > 5), Some(&1)); /// assert_eq!(numbers.iter().find_or_first(|&&x| x > 2), Some(&3)); /// assert_eq!(std::iter::empty::().find_or_first(|&x| x > 5), None); + /// + /// // An iterator of Results can return the first Ok or the first Err: + /// let input = vec![Err(()), Ok(11), Err(()), Ok(22)]; + /// assert_eq!(input.into_iter().find_or_first(Result::is_ok), Some(Ok(11))); + /// + /// let input: Vec> = vec![Err(11), Err(22)]; + /// assert_eq!(input.into_iter().find_or_first(Result::is_ok), Some(Err(11))); + /// + /// assert_eq!(std::iter::empty::>().find_or_first(Result::is_ok), None); /// ``` fn find_or_first

    (mut self, mut predicate: P) -> Option - where Self: Sized, - P: FnMut(&Self::Item) -> bool, + where + Self: Sized, + P: FnMut(&Self::Item) -> bool, { let first = self.next()?; Some(if predicate(&first) { @@ -1810,14 +2164,14 @@ pub trait Itertools : Iterator { /// /// #[derive(PartialEq, Debug)] /// enum Enum { A, B, C, D, E, } - /// + /// /// let mut iter = vec![Enum::A, Enum::B, Enum::C, Enum::D].into_iter(); - /// + /// /// // search `iter` for `B` /// assert_eq!(iter.contains(&Enum::B), true); /// // `B` was found, so the iterator now rests at the item after `B` (i.e, `C`). /// assert_eq!(iter.next(), Some(Enum::C)); - /// + /// /// // search `iter` for `E` /// assert_eq!(iter.contains(&Enum::E), false); /// // `E` wasn't found, so `iter` is now exhausted @@ -1827,7 +2181,7 @@ pub trait Itertools : Iterator { where Self: Sized, Self::Item: Borrow, - Q: PartialEq, + Q: PartialEq + ?Sized, { self.any(|x| x.borrow() == query) } @@ -1849,8 +2203,9 @@ pub trait Itertools : Iterator { /// assert!(data.into_iter().all_equal()); /// ``` fn all_equal(&mut self) -> bool - where Self: Sized, - Self::Item: PartialEq, + where + Self: Sized, + Self::Item: PartialEq, { match self.next() { None => true, @@ -1858,6 +2213,38 @@ pub trait Itertools : Iterator { } } + /// If there are elements and they are all equal, return a single copy of that element. + /// If there are no elements, return an Error containing None. + /// If there are elements and they are not all equal, return a tuple containing the first + /// two non-equal elements found. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5]; + /// assert_eq!(data.iter().all_equal_value(), Err(Some((&1, &2)))); + /// assert_eq!(data[0..3].iter().all_equal_value(), Ok(&1)); + /// assert_eq!(data[3..5].iter().all_equal_value(), Ok(&2)); + /// assert_eq!(data[5..8].iter().all_equal_value(), Ok(&3)); + /// + /// let data : Option = None; + /// assert_eq!(data.into_iter().all_equal_value(), Err(None)); + /// ``` + #[allow(clippy::type_complexity)] + fn all_equal_value(&mut self) -> Result> + where + Self: Sized, + Self::Item: PartialEq, + { + let first = self.next().ok_or(None)?; + let other = self.find(|x| x != &first); + if let Some(other) = other { + Err(Some((first, other))) + } else { + Ok(first) + } + } + /// Check whether all elements are unique (non equal). /// /// Empty iterators are considered to have unique elements: @@ -1875,8 +2262,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn all_unique(&mut self) -> bool - where Self: Sized, - Self::Item: Eq + Hash + where + Self: Sized, + Self::Item: Eq + Hash, { let mut used = HashSet::new(); self.all(move |elt| used.insert(elt)) @@ -1885,20 +2273,21 @@ pub trait Itertools : Iterator { /// Consume the first `n` elements from the iterator eagerly, /// and return the same iterator again. /// - /// It works similarly to *.skip(* `n` *)* except it is eager and + /// It works similarly to `.skip(n)` except it is eager and /// preserves the iterator type. /// /// ``` /// use itertools::Itertools; /// - /// let mut iter = "αβγ".chars().dropping(2); + /// let iter = "αβγ".chars().dropping(2); /// itertools::assert_equal(iter, "γ".chars()); /// ``` /// /// *Fusing notes: if the iterator is exhausted by dropping, /// the result of calling `.next()` again depends on the iterator implementation.* fn dropping(mut self, n: usize) -> Self - where Self: Sized + where + Self: Sized, { if n > 0 { self.nth(n - 1); @@ -1922,8 +2311,8 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(init, vec![0, 3, 6]); /// ``` fn dropping_back(mut self, n: usize) -> Self - where Self: Sized, - Self: DoubleEndedIterator + where + Self: Sized + DoubleEndedIterator, { if n > 0 { (&mut self).rev().nth(n - 1); @@ -1931,31 +2320,6 @@ pub trait Itertools : Iterator { self } - /// Run the closure `f` eagerly on each element of the iterator. - /// - /// Consumes the iterator until its end. - /// - /// ``` - /// use std::sync::mpsc::channel; - /// use itertools::Itertools; - /// - /// let (tx, rx) = channel(); - /// - /// // use .foreach() to apply a function to each value -- sending it - /// (0..5).map(|x| x * 2 + 1).foreach(|x| { tx.send(x).unwrap(); } ); - /// - /// drop(tx); - /// - /// itertools::assert_equal(rx.iter(), vec![1, 3, 5, 7, 9]); - /// ``` - #[deprecated(note="Use .for_each() instead", since="0.8.0")] - fn foreach(self, f: F) - where F: FnMut(Self::Item), - Self: Sized, - { - self.for_each(f); - } - /// Combine all an iterator's elements into one element by using [`Extend`]. /// /// This combinator will extend the first item with each of the rest of the @@ -1970,8 +2334,10 @@ pub trait Itertools : Iterator { /// vec![1, 2, 3, 4, 5, 6]); /// ``` fn concat(self) -> Self::Item - where Self: Sized, - Self::Item: Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default + where + Self: Sized, + Self::Item: + Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default, { concat(self) } @@ -1980,7 +2346,8 @@ pub trait Itertools : Iterator { /// for convenience. #[cfg(feature = "use_alloc")] fn collect_vec(self) -> Vec - where Self: Sized + where + Self: Sized, { self.collect() } @@ -1996,16 +2363,18 @@ pub trait Itertools : Iterator { /// /// fn process_dir_entries(entries: &[fs::DirEntry]) { /// // ... + /// # let _ = entries; /// } /// - /// fn do_stuff() -> std::io::Result<()> { + /// fn do_stuff() -> io::Result<()> { /// let entries: Vec<_> = fs::read_dir(".")?.try_collect()?; /// process_dir_entries(&entries); /// /// Ok(()) /// } + /// + /// # let _ = do_stuff; /// ``` - #[cfg(feature = "use_alloc")] fn try_collect(self) -> Result where Self: Sized + Iterator>, @@ -2031,21 +2400,17 @@ pub trait Itertools : Iterator { /// ``` #[inline] fn set_from<'a, A: 'a, J>(&mut self, from: J) -> usize - where Self: Iterator, - J: IntoIterator + where + Self: Iterator, + J: IntoIterator, { - let mut count = 0; - for elt in from { - match self.next() { - None => break, - Some(ptr) => *ptr = elt, - } - count += 1; - } - count + from.into_iter() + .zip(self) + .map(|(new, old)| *old = new) + .count() } - /// Combine all iterator elements into one String, separated by `sep`. + /// Combine all iterator elements into one `String`, separated by `sep`. /// /// Use the `Display` implementation of each element. /// @@ -2057,7 +2422,8 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn join(&mut self, sep: &str) -> String - where Self::Item: std::fmt::Display + where + Self::Item: std::fmt::Display, { match self.next() { None => String::new(), @@ -2091,7 +2457,8 @@ pub trait Itertools : Iterator { /// "1.10, 2.72, -3.00"); /// ``` fn format(self, sep: &str) -> Format - where Self: Sized, + where + Self: Sized, { format::new_format_default(self, sep) } @@ -2129,21 +2496,13 @@ pub trait Itertools : Iterator { /// /// ``` fn format_with(self, sep: &str, format: F) -> FormatWith - where Self: Sized, - F: FnMut(Self::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, + where + Self: Sized, + F: FnMut(Self::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { format::new_format(self, sep, format) } - /// See [`.fold_ok()`](Itertools::fold_ok). - #[deprecated(note="Use .fold_ok() instead", since="0.10.0")] - fn fold_results(&mut self, start: B, f: F) -> Result - where Self: Iterator>, - F: FnMut(B, A) -> B - { - self.fold_ok(start, f) - } - /// Fold `Result` values from an iterator. /// /// Only `Ok` values are folded. If no error is encountered, the folded @@ -2158,11 +2517,14 @@ pub trait Itertools : Iterator { /// For example the sequence *Ok(1), Ok(2), Ok(3)* will result in a /// computation like this: /// - /// ```ignore + /// ```no_run + /// # let start = 0; + /// # let f = |x, y| x + y; /// let mut accum = start; /// accum = f(accum, 1); /// accum = f(accum, 2); /// accum = f(accum, 3); + /// # let _ = accum; /// ``` /// /// With a `start` value of 0 and an addition as folding function, @@ -2187,8 +2549,9 @@ pub trait Itertools : Iterator { /// ); /// ``` fn fold_ok(&mut self, mut start: B, mut f: F) -> Result - where Self: Iterator>, - F: FnMut(B, A) -> B + where + Self: Iterator>, + F: FnMut(B, A) -> B, { for elt in self { match elt { @@ -2219,8 +2582,9 @@ pub trait Itertools : Iterator { /// assert_eq!(more_values.next().unwrap(), Some(0)); /// ``` fn fold_options(&mut self, mut start: B, mut f: F) -> Option - where Self: Iterator>, - F: FnMut(B, A) -> B + where + Self: Iterator>, + F: FnMut(B, A) -> B, { for elt in self { match elt { @@ -2243,10 +2607,14 @@ pub trait Itertools : Iterator { /// assert_eq!((0..10).fold1(|x, y| x + y).unwrap_or(0), 45); /// assert_eq!((0..0).fold1(|x, y| x * y), None); /// ``` - #[deprecated(since = "0.10.2", note = "Use `Iterator::reduce` instead")] + #[deprecated( + note = "Use [`Iterator::reduce`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.reduce) instead", + since = "0.10.2" + )] fn fold1(mut self, f: F) -> Option - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, + where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, { self.next().map(move |x| self.fold(x, f)) } @@ -2279,65 +2647,110 @@ pub trait Itertools : Iterator { /// └─f─f─f─f─f─f /// ``` /// - /// If `f` is associative, prefer the normal [`Iterator::reduce`] instead. + /// If `f` is associative you should also decide carefully: + /// + /// For an iterator producing `n` elements, both [`Iterator::reduce`] and `tree_reduce` will + /// call `f` `n - 1` times. However, `tree_reduce` will call `f` on earlier intermediate + /// results, which is beneficial for `f` that allocate and produce longer results for longer + /// arguments. For example if `f` combines arguments using `format!`, then `tree_reduce` will + /// operate on average on shorter arguments resulting in less bytes being allocated overall. + /// + /// Moreover, the output of `tree_reduce` is preferable to that of [`Iterator::reduce`] in + /// certain cases. For example, building a binary search tree using `tree_reduce` will result in + /// a balanced tree with height `O(ln(n))`, while [`Iterator::reduce`] will output a tree with + /// height `O(n)`, essentially a linked list. + /// + /// If `f` does not benefit from such a reordering, like `u32::wrapping_add`, prefer the + /// normal [`Iterator::reduce`] instead since it will most likely result in the generation of + /// simpler code because the compiler is able to optimize it. /// /// ``` /// use itertools::Itertools; /// + /// let f = |a: String, b: String| { + /// format!("f({a}, {b})") + /// }; + /// /// // The same tree as above - /// let num_strings = (1..8).map(|x| x.to_string()); - /// assert_eq!(num_strings.tree_fold1(|x, y| format!("f({}, {})", x, y)), - /// Some(String::from("f(f(f(1, 2), f(3, 4)), f(f(5, 6), 7))"))); + /// assert_eq!((1..8).map(|x| x.to_string()).tree_reduce(f), + /// Some(String::from("f(f(f(1, 2), f(3, 4)), f(f(5, 6), 7))"))); /// - /// // Like fold1, an empty iterator produces None - /// assert_eq!((0..0).tree_fold1(|x, y| x * y), None); + /// // Like reduce, an empty iterator produces None + /// assert_eq!((0..0).tree_reduce(|x, y| x * y), None); + /// + /// // tree_reduce matches reduce for associative operations... + /// assert_eq!((0..10).tree_reduce(|x, y| x + y), + /// (0..10).reduce(|x, y| x + y)); /// - /// // tree_fold1 matches fold1 for associative operations... - /// assert_eq!((0..10).tree_fold1(|x, y| x + y), - /// (0..10).fold1(|x, y| x + y)); /// // ...but not for non-associative ones - /// assert_ne!((0..10).tree_fold1(|x, y| x - y), - /// (0..10).fold1(|x, y| x - y)); + /// assert_ne!((0..10).tree_reduce(|x, y| x - y), + /// (0..10).reduce(|x, y| x - y)); + /// + /// let mut total_len_reduce = 0; + /// let reduce_res = (1..100).map(|x| x.to_string()) + /// .reduce(|a, b| { + /// let r = f(a, b); + /// total_len_reduce += r.len(); + /// r + /// }) + /// .unwrap(); + /// + /// let mut total_len_tree_reduce = 0; + /// let tree_reduce_res = (1..100).map(|x| x.to_string()) + /// .tree_reduce(|a, b| { + /// let r = f(a, b); + /// total_len_tree_reduce += r.len(); + /// r + /// }) + /// .unwrap(); + /// + /// assert_eq!(total_len_reduce, 33299); + /// assert_eq!(total_len_tree_reduce, 4228); + /// assert_eq!(reduce_res.len(), tree_reduce_res.len()); /// ``` - fn tree_fold1(mut self, mut f: F) -> Option - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, + fn tree_reduce(mut self, mut f: F) -> Option + where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, { type State = Result>; fn inner0(it: &mut II, f: &mut FF) -> State - where - II: Iterator, - FF: FnMut(T, T) -> T + where + II: Iterator, + FF: FnMut(T, T) -> T, { // This function could be replaced with `it.next().ok_or(None)`, - // but half the useful tree_fold1 work is combining adjacent items, + // but half the useful tree_reduce work is combining adjacent items, // so put that in a form that LLVM is more likely to optimize well. - let a = - if let Some(v) = it.next() { v } - else { return Err(None) }; - let b = - if let Some(v) = it.next() { v } - else { return Err(Some(a)) }; + let a = if let Some(v) = it.next() { + v + } else { + return Err(None); + }; + let b = if let Some(v) = it.next() { + v + } else { + return Err(Some(a)); + }; Ok(f(a, b)) } fn inner(stop: usize, it: &mut II, f: &mut FF) -> State - where - II: Iterator, - FF: FnMut(T, T) -> T + where + II: Iterator, + FF: FnMut(T, T) -> T, { let mut x = inner0(it, f)?; for height in 0..stop { // Try to get another tree the same size with which to combine it, // creating a new tree that's twice as big for next time around. - let next = - if height == 0 { - inner0(it, f) - } else { - inner(height, it, f) - }; + let next = if height == 0 { + inner0(it, f) + } else { + inner(height, it, f) + }; match next { Ok(y) => x = f(x, y), @@ -2352,12 +2765,22 @@ pub trait Itertools : Iterator { Ok(x) } - match inner(usize::max_value(), &mut self, &mut f) { + match inner(usize::MAX, &mut self, &mut f) { Err(x) => x, _ => unreachable!(), } } + /// See [`.tree_reduce()`](Itertools::tree_reduce). + #[deprecated(note = "Use .tree_reduce() instead", since = "0.13.0")] + fn tree_fold1(self, f: F) -> Option + where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, + { + self.tree_reduce(f) + } + /// An iterator method that applies a function, producing a single, final value. /// /// `fold_while()` is basically equivalent to [`Iterator::fold`] but with additional support for @@ -2398,19 +2821,19 @@ pub trait Itertools : Iterator { /// `fold()` called the provided closure for every item of the callee iterator, /// `fold_while()` actually stopped iterating as soon as it encountered `Fold::Done(_)`. fn fold_while(&mut self, init: B, mut f: F) -> FoldWhile - where Self: Sized, - F: FnMut(B, Self::Item) -> FoldWhile + where + Self: Sized, + F: FnMut(B, Self::Item) -> FoldWhile, { - use Result::{ - Ok as Continue, - Err as Break, - }; + use Result::{Err as Break, Ok as Continue}; - let result = self.try_fold(init, #[inline(always)] |acc, v| - match f(acc, v) { - FoldWhile::Continue(acc) => Continue(acc), - FoldWhile::Done(acc) => Break(acc), - } + let result = self.try_fold( + init, + #[inline(always)] + |acc, v| match f(acc, v) { + FoldWhile::Continue(acc) => Continue(acc), + FoldWhile::Done(acc) => Break(acc), + }, ); match result { @@ -2441,11 +2864,11 @@ pub trait Itertools : Iterator { /// assert_eq!(nonempty_sum, Some(55)); /// ``` fn sum1(mut self) -> Option - where Self: Sized, - S: std::iter::Sum, + where + Self: Sized, + S: std::iter::Sum, { - self.next() - .map(|first| once(first).chain(self).sum()) + self.next().map(|first| once(first).chain(self).sum()) } /// Iterate over the entire iterator and multiply all the elements. @@ -2469,11 +2892,11 @@ pub trait Itertools : Iterator { /// assert_eq!(nonempty_product, Some(3628800)); /// ``` fn product1

    (mut self) -> Option

    - where Self: Sized, - P: std::iter::Product, + where + Self: Sized, + P: std::iter::Product, { - self.next() - .map(|first| once(first).chain(self).product()) + self.next().map(|first| once(first).chain(self).product()) } /// Sort all iterator elements into a new iterator in ascending order. @@ -2482,6 +2905,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_unstable`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is unstable (i.e., may reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2495,8 +2920,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_unstable(self) -> VecIntoIter - where Self: Sized, - Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { // Use .sort_unstable() directly since it is not quite identical with // .sort_by(Ord::cmp) @@ -2511,6 +2937,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_unstable_by`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is unstable (i.e., may reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2530,8 +2958,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_unstable_by(self, cmp: F) -> VecIntoIter - where Self: Sized, - F: FnMut(&Self::Item, &Self::Item) -> Ordering, + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { let mut v = Vec::from_iter(self); v.sort_unstable_by(cmp); @@ -2544,6 +2973,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_unstable_by_key`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is unstable (i.e., may reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2563,9 +2994,10 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_unstable_by_key(self, f: F) -> VecIntoIter - where Self: Sized, - K: Ord, - F: FnMut(&Self::Item) -> K, + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { let mut v = Vec::from_iter(self); v.sort_unstable_by_key(f); @@ -2578,6 +3010,8 @@ pub trait Itertools : Iterator { /// [`slice::sort`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is stable (i.e., does not reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2591,8 +3025,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted(self) -> VecIntoIter - where Self: Sized, - Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { // Use .sort() directly since it is not quite identical with // .sort_by(Ord::cmp) @@ -2607,6 +3042,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_by`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is stable (i.e., does not reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2614,7 +3051,7 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2626,8 +3063,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_by(self, cmp: F) -> VecIntoIter - where Self: Sized, - F: FnMut(&Self::Item, &Self::Item) -> Ordering, + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { let mut v = Vec::from_iter(self); v.sort_by(cmp); @@ -2640,6 +3078,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_by_key`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is stable (i.e., does not reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2647,7 +3087,7 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2659,9 +3099,10 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_by_key(self, f: F) -> VecIntoIter - where Self: Sized, - K: Ord, - F: FnMut(&Self::Item) -> K, + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { let mut v = Vec::from_iter(self); v.sort_by_key(f); @@ -2675,6 +3116,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_by_cached_key`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is stable (i.e., does not reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2682,7 +3125,7 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2733,12 +3176,440 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn k_smallest(self, k: usize) -> VecIntoIter - where Self: Sized, - Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { - crate::k_smallest::k_smallest(self, k) - .into_sorted_vec() - .into_iter() + // The stdlib heap has optimised handling of "holes", which is not included in our heap implementation in k_smallest_general. + // While the difference is unlikely to have practical impact unless `Self::Item` is very large, this method uses the stdlib structure + // to maintain performance compared to previous versions of the crate. + use alloc::collections::BinaryHeap; + + if k == 0 { + self.last(); + return Vec::new().into_iter(); + } + if k == 1 { + return self.min().into_iter().collect_vec().into_iter(); + } + + let mut iter = self.fuse(); + let mut heap: BinaryHeap<_> = iter.by_ref().take(k).collect(); + + iter.for_each(|i| { + debug_assert_eq!(heap.len(), k); + // Equivalent to heap.push(min(i, heap.pop())) but more efficient. + // This should be done with a single `.peek_mut().unwrap()` but + // `PeekMut` sifts-down unconditionally on Rust 1.46.0 and prior. + if *heap.peek().unwrap() > i { + *heap.peek_mut().unwrap() = i; + } + }); + + heap.into_sorted_vec().into_iter() + } + + /// Sort the k smallest elements into a new iterator using the provided comparison. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// This corresponds to `self.sorted_by(cmp).take(k)` in the same way that + /// [`k_smallest`](Itertools::k_smallest) corresponds to `self.sorted().take(k)`, + /// in both semantics and complexity. + /// + /// Particularly, a custom heap implementation ensures the comparison is not cloned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b))); + /// + /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_by(self, k: usize, cmp: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + k_smallest::k_smallest_general(self, k, cmp).into_iter() + } + + /// Return the elements producing the k smallest outputs of the provided function. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// This corresponds to `self.sorted_by_key(key).take(k)` in the same way that + /// [`k_smallest`](Itertools::k_smallest) corresponds to `self.sorted().take(k)`, + /// in both semantics and complexity. + /// + /// Particularly, a custom heap implementation ensures the comparison is not cloned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_by_key(5, |n| (n % 7, *n)); + /// + /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_by_key(self, k: usize, key: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: Ord, + { + self.k_smallest_by(k, k_smallest::key_to_cmp(key)) + } + + /// Sort the k smallest elements into a new iterator, in ascending order, relaxing the amount of memory required. + /// + /// **Note:** This consumes the entire iterator, and returns the result + /// as a new iterator that owns its elements. If the input contains + /// less than k elements, the result is equivalent to `self.sorted()`. + /// + /// This is guaranteed to use `2 * k * sizeof(Self::Item) + O(1)` memory + /// and `O(n + k log k)` time, with `n` the number of elements in the input, + /// meaning it uses more memory than the minimum obtained by [`k_smallest`](Itertools::k_smallest) + /// but achieves linear time in the number of elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// **Note:** This is functionally-equivalent to `self.sorted().take(k)` + /// but much more efficient. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_relaxed(5); + /// + /// itertools::assert_equal(five_smallest, 0..5); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_relaxed(self, k: usize) -> VecIntoIter + where + Self: Sized, + Self::Item: Ord, + { + self.k_smallest_relaxed_by(k, Ord::cmp) + } + + /// Sort the k smallest elements into a new iterator using the provided comparison, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// This corresponds to `self.sorted_by(cmp).take(k)` in the same way that + /// [`k_smallest_relaxed`](Itertools::k_smallest_relaxed) corresponds to `self.sorted().take(k)`, + /// in both semantics and complexity. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_relaxed_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b))); + /// + /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_relaxed_by(self, k: usize, cmp: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + k_smallest::k_smallest_relaxed_general(self, k, cmp).into_iter() + } + + /// Return the elements producing the k smallest outputs of the provided function, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// This corresponds to `self.sorted_by_key(key).take(k)` in the same way that + /// [`k_smallest_relaxed`](Itertools::k_smallest_relaxed) corresponds to `self.sorted().take(k)`, + /// in both semantics and complexity. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_relaxed_by_key(5, |n| (n % 7, *n)); + /// + /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_relaxed_by_key(self, k: usize, key: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: Ord, + { + self.k_smallest_relaxed_by(k, k_smallest::key_to_cmp(key)) + } + + /// Sort the k largest elements into a new iterator, in descending order. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// It is semantically equivalent to [`k_smallest`](Itertools::k_smallest) + /// with a reversed `Ord`. + /// However, this is implemented with a custom binary heap which does not + /// have the same performance characteristics for very large `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest(5); + /// + /// itertools::assert_equal(five_largest, vec![14, 13, 12, 11, 10]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest(self, k: usize) -> VecIntoIter + where + Self: Sized, + Self::Item: Ord, + { + self.k_largest_by(k, Self::Item::cmp) + } + + /// Sort the k largest elements into a new iterator using the provided comparison. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// Functionally equivalent to [`k_smallest_by`](Itertools::k_smallest_by) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b))); + /// + /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_by(self, k: usize, mut cmp: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + self.k_smallest_by(k, move |a, b| cmp(b, a)) + } + + /// Return the elements producing the k largest outputs of the provided function. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// Functionally equivalent to [`k_smallest_by_key`](Itertools::k_smallest_by_key) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_by_key(5, |n| (n % 7, *n)); + /// + /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_by_key(self, k: usize, key: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: Ord, + { + self.k_largest_by(k, k_smallest::key_to_cmp(key)) + } + + /// Sort the k largest elements into a new iterator, in descending order, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// It is semantically equivalent to [`k_smallest_relaxed`](Itertools::k_smallest_relaxed) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_relaxed(5); + /// + /// itertools::assert_equal(five_largest, vec![14, 13, 12, 11, 10]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_relaxed(self, k: usize) -> VecIntoIter + where + Self: Sized, + Self::Item: Ord, + { + self.k_largest_relaxed_by(k, Self::Item::cmp) + } + + /// Sort the k largest elements into a new iterator using the provided comparison, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// Functionally equivalent to [`k_smallest_relaxed_by`](Itertools::k_smallest_relaxed_by) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_relaxed_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b))); + /// + /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_relaxed_by(self, k: usize, mut cmp: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + self.k_smallest_relaxed_by(k, move |a, b| cmp(b, a)) + } + + /// Return the elements producing the k largest outputs of the provided function, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// Functionally equivalent to [`k_smallest_relaxed_by_key`](Itertools::k_smallest_relaxed_by_key) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_relaxed_by_key(5, |n| (n % 7, *n)); + /// + /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_relaxed_by_key(self, k: usize, key: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: Ord, + { + self.k_largest_relaxed_by(k, k_smallest::key_to_cmp(key)) + } + + /// Consumes the iterator and return an iterator of the last `n` elements. + /// + /// The iterator, if directly collected to a `VecDeque`, is converted + /// without any extra copying or allocation cost. + /// If directly collected to a `Vec`, it may need some data movement + /// but no re-allocation. + /// + /// ``` + /// use itertools::{assert_equal, Itertools}; + /// + /// let v = vec![5, 9, 8, 4, 2, 12, 0]; + /// assert_equal(v.iter().tail(3), &[2, 12, 0]); + /// assert_equal(v.iter().tail(10), &v); + /// + /// assert_equal(v.iter().tail(1), v.iter().last()); + /// + /// assert_equal((0..100).tail(10), 90..100); + /// + /// assert_equal((0..100).filter(|x| x % 3 == 0).tail(10), (72..100).step_by(3)); + /// ``` + /// + /// For double ended iterators without side-effects, you might prefer + /// `.rev().take(n).rev()` to have a similar result (lazy and non-allocating) + /// without consuming the entire iterator. + #[cfg(feature = "use_alloc")] + fn tail(self, n: usize) -> VecDequeIntoIter + where + Self: Sized, + { + match n { + 0 => { + self.last(); + VecDeque::new() + } + 1 => self.last().into_iter().collect(), + _ => { + // Skip the starting part of the iterator if possible. + let (low, _) = self.size_hint(); + let mut iter = self.fuse().skip(low.saturating_sub(n)); + // TODO: If VecDeque has a more efficient method than + // `.pop_front();.push_back(val)` in the future then maybe revisit this. + let mut data: Vec<_> = iter.by_ref().take(n).collect(); + // Update `data` cyclically. + let idx = iter.fold(0, |i, val| { + debug_assert_eq!(data.len(), n); + data[i] = val; + if i + 1 == n { + 0 + } else { + i + 1 + } + }); + // Respect the insertion order, efficiently. + let mut data = VecDeque::from(data); + data.rotate_left(idx); + data + } + } + .into_iter() } /// Collect all iterator elements into one of two @@ -2763,10 +3634,11 @@ pub trait Itertools : Iterator { /// assert_eq!(failures, [false, true]); /// ``` fn partition_map(self, mut predicate: F) -> (A, B) - where Self: Sized, - F: FnMut(Self::Item) -> Either, - A: Default + Extend, - B: Default + Extend, + where + Self: Sized, + F: FnMut(Self::Item) -> Either, + A: Default + Extend, + B: Default + Extend, { let mut left = A::default(); let mut right = B::default(); @@ -2795,10 +3667,10 @@ pub trait Itertools : Iterator { /// assert_eq!(failures, [false, true]); /// ``` fn partition_result(self) -> (A, B) - where - Self: Iterator> + Sized, - A: Default + Extend, - B: Default + Extend, + where + Self: Iterator> + Sized, + A: Default + Extend, + B: Default + Extend, { self.partition_map(|r| match r { Ok(v) => Either::Left(v), @@ -2824,14 +3696,15 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn into_group_map(self) -> HashMap> - where Self: Iterator + Sized, - K: Hash + Eq, + where + Self: Iterator + Sized, + K: Hash + Eq, { group_map::into_group_map(self) } - /// Return an `Iterator` on a `HashMap`. Keys mapped to `Vec`s of values. The key is specified - /// in the closure. + /// Return a `HashMap` of keys mapped to `Vec`s of values. The key is specified + /// in the closure. The values are taken from the input iterator. /// /// Essentially a shorthand for `.into_grouping_map_by(f).collect::>()`. /// @@ -2843,7 +3716,7 @@ pub trait Itertools : Iterator { /// let lookup: HashMap> = /// data.clone().into_iter().into_group_map_by(|a| a.0); /// - /// assert_eq!(lookup[&0], vec![(0,10),(0,20)]); + /// assert_eq!(lookup[&0], vec![(0,10), (0,20)]); /// assert_eq!(lookup.get(&1), None); /// assert_eq!(lookup[&2], vec![(2,12), (2,42)]); /// assert_eq!(lookup[&3], vec![(3,13), (3,33)]); @@ -2859,46 +3732,48 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn into_group_map_by(self, f: F) -> HashMap> - where - Self: Iterator + Sized, - K: Hash + Eq, - F: Fn(&V) -> K, + where + Self: Iterator + Sized, + K: Hash + Eq, + F: FnMut(&V) -> K, { group_map::into_group_map_by(self, f) } - /// Constructs a `GroupingMap` to be used later with one of the efficient + /// Constructs a `GroupingMap` to be used later with one of the efficient /// group-and-fold operations it allows to perform. - /// + /// /// The input iterator must yield item in the form of `(K, V)` where the /// value of type `K` will be used as key to identify the groups and the /// value of type `V` as value for the folding operation. - /// + /// /// See [`GroupingMap`] for more informations /// on what operations are available. #[cfg(feature = "use_std")] fn into_grouping_map(self) -> GroupingMap - where Self: Iterator + Sized, - K: Hash + Eq, + where + Self: Iterator + Sized, + K: Hash + Eq, { grouping_map::new(self) } - /// Constructs a `GroupingMap` to be used later with one of the efficient + /// Constructs a `GroupingMap` to be used later with one of the efficient /// group-and-fold operations it allows to perform. - /// + /// /// The values from this iterator will be used as values for the folding operation /// while the keys will be obtained from the values by calling `key_mapper`. - /// + /// /// See [`GroupingMap`] for more informations /// on what operations are available. #[cfg(feature = "use_std")] fn into_grouping_map_by(self, key_mapper: F) -> GroupingMapBy - where Self: Iterator + Sized, - K: Hash + Eq, - F: FnMut(&V) -> K + where + Self: Iterator + Sized, + K: Hash + Eq, + F: FnMut(&V) -> K, { - grouping_map::new(grouping_map::MapForGrouping::new(self, key_mapper)) + grouping_map::new(grouping_map::new_map_for_grouping(self, key_mapper)) } /// Return all minimum elements of an iterator. @@ -2923,9 +3798,11 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn min_set(self) -> Vec - where Self: Sized, Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { extrema_set::min_set_impl(self, |_| (), |x, y, _, _| x.cmp(y)) } @@ -2954,15 +3831,13 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn min_set_by(self, mut compare: F) -> Vec - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { - extrema_set::min_set_impl( - self, - |_| (), - |x, y, _, _| compare(x, y) - ) + extrema_set::min_set_impl(self, |_| (), |x, y, _, _| compare(x, y)) } /// Return all minimum elements of an iterator, as determined by @@ -2988,9 +3863,12 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn min_set_by_key(self, key: F) -> Vec - where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { extrema_set::min_set_impl(self, key, |_, _, kx, ky| kx.cmp(ky)) } @@ -3017,9 +3895,11 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn max_set(self) -> Vec - where Self: Sized, Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { extrema_set::max_set_impl(self, |_| (), |x, y, _, _| x.cmp(y)) } @@ -3048,18 +3928,16 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn max_set_by(self, mut compare: F) -> Vec - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { - extrema_set::max_set_impl( - self, - |_| (), - |x, y, _, _| compare(x, y) - ) + extrema_set::max_set_impl(self, |_| (), |x, y, _, _| compare(x, y)) } - /// Return all minimum elements of an iterator, as determined by + /// Return all maximum elements of an iterator, as determined by /// the specified function. /// /// # Examples @@ -3082,9 +3960,12 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn max_set_by_key(self, key: F) -> Vec - where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { extrema_set::max_set_impl(self, key, |_, _, kx, ky| kx.cmp(ky)) } @@ -3125,7 +4006,9 @@ pub trait Itertools : Iterator { /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. fn minmax(self) -> MinMaxResult - where Self: Sized, Self::Item: PartialOrd + where + Self: Sized, + Self::Item: PartialOrd, { minmax::minmax_impl(self, |_| (), |x, y, _, _| x < y) } @@ -3142,7 +4025,10 @@ pub trait Itertools : Iterator { /// The keys can be floats but no particular result is guaranteed /// if a key is NaN. fn minmax_by_key(self, key: F) -> MinMaxResult - where Self: Sized, K: PartialOrd, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: PartialOrd, + F: FnMut(&Self::Item) -> K, { minmax::minmax_impl(self, key, |_, _, xk, yk| xk < yk) } @@ -3156,13 +4042,11 @@ pub trait Itertools : Iterator { /// the last maximal element wins. This matches the behavior of the standard /// [`Iterator::min`] and [`Iterator::max`] methods. fn minmax_by(self, mut compare: F) -> MinMaxResult - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { - minmax::minmax_impl( - self, - |_| (), - |x, y, _, _| Ordering::Less == compare(x, y) - ) + minmax::minmax_impl(self, |_| (), |x, y, _, _| Ordering::Less == compare(x, y)) } /// Return the position of the maximum element in the iterator. @@ -3185,7 +4069,9 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_max(), Some(1)); /// ``` fn position_max(self) -> Option - where Self: Sized, Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { self.enumerate() .max_by(|x, y| Ord::cmp(&x.1, &y.1)) @@ -3213,7 +4099,10 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_max_by_key(|x| x.abs()), Some(3)); /// ``` fn position_max_by_key(self, mut key: F) -> Option - where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { self.enumerate() .max_by(|x, y| Ord::cmp(&key(&x.1), &key(&y.1))) @@ -3241,7 +4130,9 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_max_by(|x, y| x.cmp(y)), Some(1)); /// ``` fn position_max_by(self, mut compare: F) -> Option - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { self.enumerate() .max_by(|x, y| compare(&x.1, &y.1)) @@ -3268,7 +4159,9 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_min(), Some(2)); /// ``` fn position_min(self) -> Option - where Self: Sized, Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { self.enumerate() .min_by(|x, y| Ord::cmp(&x.1, &y.1)) @@ -3296,7 +4189,10 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_min_by_key(|x| x.abs()), Some(0)); /// ``` fn position_min_by_key(self, mut key: F) -> Option - where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { self.enumerate() .min_by(|x, y| Ord::cmp(&key(&x.1), &key(&y.1))) @@ -3324,7 +4220,9 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_min_by(|x, y| x.cmp(y)), Some(2)); /// ``` fn position_min_by(self, mut compare: F) -> Option - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { self.enumerate() .min_by(|x, y| compare(&x.1, &y.1)) @@ -3374,9 +4272,11 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_minmax(), MinMax(2, 1)); /// ``` fn position_minmax(self) -> MinMaxResult - where Self: Sized, Self::Item: PartialOrd + where + Self: Sized, + Self::Item: PartialOrd, { - use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + use crate::MinMaxResult::{MinMax, NoElements, OneElement}; match minmax::minmax_impl(self.enumerate(), |_| (), |x, y, _, _| x.1 < y.1) { NoElements => NoElements, OneElement(x) => OneElement(x.0), @@ -3419,9 +4319,12 @@ pub trait Itertools : Iterator { /// /// [`position_minmax`]: Self::position_minmax fn position_minmax_by_key(self, mut key: F) -> MinMaxResult - where Self: Sized, K: PartialOrd, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: PartialOrd, + F: FnMut(&Self::Item) -> K, { - use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + use crate::MinMaxResult::{MinMax, NoElements, OneElement}; match self.enumerate().minmax_by_key(|e| key(&e.1)) { NoElements => NoElements, OneElement(x) => OneElement(x.0), @@ -3461,9 +4364,11 @@ pub trait Itertools : Iterator { /// /// [`position_minmax`]: Self::position_minmax fn position_minmax_by(self, mut compare: F) -> MinMaxResult - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { - use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + use crate::MinMaxResult::{MinMax, NoElements, OneElement}; match self.enumerate().minmax_by(|x, y| compare(&x.1, &y.1)) { NoElements => NoElements, OneElement(x) => OneElement(x.0), @@ -3493,21 +4398,18 @@ pub trait Itertools : Iterator { Self: Sized, { match self.next() { - Some(first) => { - match self.next() { - Some(second) => { - Err(ExactlyOneError::new(Some(Either::Left([first, second])), self)) - } - None => { - Ok(first) - } - } - } + Some(first) => match self.next() { + Some(second) => Err(ExactlyOneError::new( + Some(Either::Left([first, second])), + self, + )), + None => Ok(first), + }, None => Err(ExactlyOneError::new(None, self)), } } - /// If the iterator yields no elements, Ok(None) will be returned. If the iterator yields + /// If the iterator yields no elements, `Ok(None)` will be returned. If the iterator yields /// exactly one element, that element will be returned, otherwise an error will be returned /// containing an iterator that has the same output as the input iterator. /// @@ -3529,16 +4431,13 @@ pub trait Itertools : Iterator { Self: Sized, { match self.next() { - Some(first) => { - match self.next() { - Some(second) => { - Err(ExactlyOneError::new(Some(Either::Left([first, second])), self)) - } - None => { - Ok(Some(first)) - } - } - } + Some(first) => match self.next() { + Some(second) => Err(ExactlyOneError::new( + Some(Either::Left([first, second])), + self, + )), + None => Ok(Some(first)), + }, None => Ok(None), } } @@ -3572,7 +4471,7 @@ pub trait Itertools : Iterator { /// # Examples /// ``` /// # use itertools::Itertools; - /// let counts = [1, 1, 1, 3, 3, 5].into_iter().counts(); + /// let counts = [1, 1, 1, 3, 3, 5].iter().counts(); /// assert_eq!(counts[&1], 3); /// assert_eq!(counts[&3], 2); /// assert_eq!(counts[&5], 1); @@ -3598,9 +4497,10 @@ pub trait Itertools : Iterator { /// # use itertools::Itertools; /// struct Character { /// first_name: &'static str, + /// # #[allow(dead_code)] /// last_name: &'static str, /// } - /// + /// /// let characters = /// vec![ /// Character { first_name: "Amy", last_name: "Pond" }, @@ -3611,12 +4511,12 @@ pub trait Itertools : Iterator { /// Character { first_name: "James", last_name: "Norington" }, /// Character { first_name: "James", last_name: "Kirk" }, /// ]; - /// - /// let first_name_frequency = + /// + /// let first_name_frequency = /// characters /// .into_iter() /// .counts_by(|c| c.first_name); - /// + /// /// assert_eq!(first_name_frequency["Amy"], 3); /// assert_eq!(first_name_frequency["James"], 4); /// assert_eq!(first_name_frequency.contains_key("Asha"), false); @@ -3633,11 +4533,11 @@ pub trait Itertools : Iterator { /// Converts an iterator of tuples into a tuple of containers. /// - /// `unzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each + /// It consumes an entire iterator of n-ary tuples, producing `n` collections, one for each /// column. /// /// This function is, in some sense, the opposite of [`multizip`]. - /// + /// /// ``` /// use itertools::Itertools; /// @@ -3657,9 +4557,33 @@ pub trait Itertools : Iterator { { MultiUnzip::multiunzip(self) } + + /// Returns the length of the iterator if one exists. + /// Otherwise return `self.size_hint()`. + /// + /// Fallible [`ExactSizeIterator::len`]. + /// + /// Inherits guarantees and restrictions from [`Iterator::size_hint`]. + /// + /// ``` + /// use itertools::Itertools; + /// + /// assert_eq!([0; 10].iter().try_len(), Ok(10)); + /// assert_eq!((10..15).try_len(), Ok(5)); + /// assert_eq!((15..10).try_len(), Ok(0)); + /// assert_eq!((10..).try_len(), Err((usize::MAX, None))); + /// assert_eq!((10..15).filter(|x| x % 2 == 0).try_len(), Err((0, Some(5)))); + /// ``` + fn try_len(&self) -> Result { + let sh = self.size_hint(); + match sh { + (lo, Some(hi)) if lo == hi => Ok(lo), + _ => Err(sh), + } + } } -impl Itertools for T where T: Iterator { } +impl Itertools for T where T: Iterator + ?Sized {} /// Return `true` if both iterables produce equal sequences /// (elements pairwise equal and sequences of the same length), @@ -3672,9 +4596,10 @@ impl Itertools for T where T: Iterator { } /// assert!(!itertools::equal(&[0, 0], &[0, 0, 0])); /// ``` pub fn equal(a: I, b: J) -> bool - where I: IntoIterator, - J: IntoIterator, - I::Item: PartialEq +where + I: IntoIterator, + J: IntoIterator, + I::Item: PartialEq, { a.into_iter().eq(b) } @@ -3683,31 +4608,39 @@ pub fn equal(a: I, b: J) -> bool /// semantics as [`equal(a, b)`](equal). /// /// **Panics** on assertion failure with a message that shows the -/// two iteration elements. +/// two different elements and the iteration index. /// -/// ```ignore +/// ```should_panic +/// # use itertools::assert_equal; /// assert_equal("exceed".split('c'), "excess".split('c')); -/// // ^PANIC: panicked at 'Failed assertion Some("eed") == Some("ess") for iteration 1', +/// // ^PANIC: panicked at 'Failed assertion Some("eed") == Some("ess") for iteration 1'. /// ``` +#[track_caller] pub fn assert_equal(a: I, b: J) - where I: IntoIterator, - J: IntoIterator, - I::Item: fmt::Debug + PartialEq, - J::Item: fmt::Debug, +where + I: IntoIterator, + J: IntoIterator, + I::Item: fmt::Debug + PartialEq, + J::Item: fmt::Debug, { let mut ia = a.into_iter(); let mut ib = b.into_iter(); - let mut i = 0; + let mut i: usize = 0; loop { match (ia.next(), ib.next()) { (None, None) => return, (a, b) => { let equal = match (&a, &b) { - (&Some(ref a), &Some(ref b)) => a == b, + (Some(a), Some(b)) => a == b, _ => false, }; - assert!(equal, "Failed assertion {a:?} == {b:?} for iteration {i}", - i=i, a=a, b=b); + assert!( + equal, + "Failed assertion {a:?} == {b:?} for iteration {i}", + i = i, + a = a, + b = b + ); i += 1; } } @@ -3732,22 +4665,18 @@ pub fn assert_equal(a: I, b: J) /// assert_eq!(split_index, 3); /// ``` pub fn partition<'a, A: 'a, I, F>(iter: I, mut pred: F) -> usize - where I: IntoIterator, - I::IntoIter: DoubleEndedIterator, - F: FnMut(&A) -> bool +where + I: IntoIterator, + I::IntoIter: DoubleEndedIterator, + F: FnMut(&A) -> bool, { let mut split_index = 0; let mut iter = iter.into_iter(); - 'main: while let Some(front) = iter.next() { + while let Some(front) = iter.next() { if !pred(front) { - loop { - match iter.next_back() { - Some(back) => if pred(back) { - std::mem::swap(front, back); - break; - }, - None => break 'main, - } + match iter.rfind(|back| pred(back)) { + Some(back) => std::mem::swap(front, back), + None => break, } } split_index += 1; @@ -3770,15 +4699,15 @@ impl FoldWhile { /// Return the value in the continue or done. pub fn into_inner(self) -> T { match self { - FoldWhile::Continue(x) | FoldWhile::Done(x) => x, + Self::Continue(x) | Self::Done(x) => x, } } /// Return true if `self` is `Done`, false if it is `Continue`. pub fn is_done(&self) -> bool { match *self { - FoldWhile::Continue(_) => false, - FoldWhile::Done(_) => true, + Self::Continue(_) => false, + Self::Done(_) => true, } } } diff --git a/third_party/rust/itertools/src/merge_join.rs b/third_party/rust/itertools/src/merge_join.rs index f2fbdea2c48..5f4a605fa25 100644 --- a/third_party/rust/itertools/src/merge_join.rs +++ b/third_party/rust/itertools/src/merge_join.rs @@ -1,151 +1,315 @@ use std::cmp::Ordering; -use std::iter::Fuse; use std::fmt; +use std::iter::{Fuse, FusedIterator}; +use std::marker::PhantomData; -use super::adaptors::{PutBack, put_back}; +use either::Either; + +use super::adaptors::{put_back, PutBack}; use crate::either_or_both::EitherOrBoth; +use crate::size_hint::{self, SizeHint}; #[cfg(doc)] use crate::Itertools; +#[derive(Clone, Debug)] +pub struct MergeLte; + +/// An iterator adaptor that merges the two base iterators in ascending order. +/// If both base iterators are sorted (ascending), the result is sorted. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.merge()`](crate::Itertools::merge_by) for more information. +pub type Merge = MergeBy; + +/// Create an iterator that merges elements in `i` and `j`. +/// +/// [`IntoIterator`] enabled version of [`Itertools::merge`](crate::Itertools::merge). +/// +/// ``` +/// use itertools::merge; +/// +/// for elt in merge(&[1, 2, 3], &[2, 3, 4]) { +/// /* loop body */ +/// # let _ = elt; +/// } +/// ``` +pub fn merge( + i: I, + j: J, +) -> Merge<::IntoIter, ::IntoIter> +where + I: IntoIterator, + J: IntoIterator, + I::Item: PartialOrd, +{ + merge_by_new(i, j, MergeLte) +} + +/// An iterator adaptor that merges the two base iterators in ascending order. +/// If both base iterators are sorted (ascending), the result is sorted. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.merge_by()`](crate::Itertools::merge_by) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct MergeBy { + left: PutBack>, + right: PutBack>, + cmp_fn: F, +} + +/// Create a `MergeBy` iterator. +pub fn merge_by_new(a: I, b: J, cmp: F) -> MergeBy +where + I: IntoIterator, + J: IntoIterator, +{ + MergeBy { + left: put_back(a.into_iter().fuse()), + right: put_back(b.into_iter().fuse()), + cmp_fn: cmp, + } +} + /// Return an iterator adaptor that merge-joins items from the two base iterators in ascending order. /// /// [`IntoIterator`] enabled version of [`Itertools::merge_join_by`]. -pub fn merge_join_by(left: I, right: J, cmp_fn: F) - -> MergeJoinBy - where I: IntoIterator, - J: IntoIterator, - F: FnMut(&I::Item, &J::Item) -> Ordering +pub fn merge_join_by( + left: I, + right: J, + cmp_fn: F, +) -> MergeJoinBy +where + I: IntoIterator, + J: IntoIterator, + F: FnMut(&I::Item, &J::Item) -> T, { - MergeJoinBy { + MergeBy { left: put_back(left.into_iter().fuse()), right: put_back(right.into_iter().fuse()), - cmp_fn, + cmp_fn: MergeFuncLR(cmp_fn, PhantomData), } } /// An iterator adaptor that merge-joins items from the two base iterators in ascending order. /// /// See [`.merge_join_by()`](crate::Itertools::merge_join_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MergeJoinBy { - left: PutBack>, - right: PutBack>, - cmp_fn: F +pub type MergeJoinBy = + MergeBy::Item, ::Item>>::T>>; + +#[derive(Clone, Debug)] +pub struct MergeFuncLR(F, PhantomData); + +pub trait FuncLR { + type T; } -impl Clone for MergeJoinBy - where I: Iterator, - J: Iterator, - PutBack>: Clone, - PutBack>: Clone, - F: Clone, -{ - clone_fields!(left, right, cmp_fn); +impl T> FuncLR for F { + type T = T; } -impl fmt::Debug for MergeJoinBy - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, - J: Iterator + fmt::Debug, - J::Item: fmt::Debug, -{ - debug_fmt_fields!(MergeJoinBy, left, right); +pub trait OrderingOrBool { + type MergeResult; + fn left(left: L) -> Self::MergeResult; + fn right(right: R) -> Self::MergeResult; + // "merge" never returns (Some(...), Some(...), ...) so Option> + // is appealing but it is always followed by two put_backs, so we think the compiler is + // smart enough to optimize it. Or we could move put_backs into "merge". + fn merge(&mut self, left: L, right: R) -> (Option>, Self::MergeResult); + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint; } -impl Iterator for MergeJoinBy - where I: Iterator, - J: Iterator, - F: FnMut(&I::Item, &J::Item) -> Ordering -{ - type Item = EitherOrBoth; - - fn next(&mut self) -> Option { - match (self.left.next(), self.right.next()) { - (None, None) => None, - (Some(left), None) => - Some(EitherOrBoth::Left(left)), - (None, Some(right)) => - Some(EitherOrBoth::Right(right)), - (Some(left), Some(right)) => { - match (self.cmp_fn)(&left, &right) { - Ordering::Equal => - Some(EitherOrBoth::Both(left, right)), - Ordering::Less => { - self.right.put_back(right); - Some(EitherOrBoth::Left(left)) - }, - Ordering::Greater => { - self.left.put_back(left); - Some(EitherOrBoth::Right(right)) - } - } - } +impl Ordering> OrderingOrBool for MergeFuncLR { + type MergeResult = EitherOrBoth; + fn left(left: L) -> Self::MergeResult { + EitherOrBoth::Left(left) + } + fn right(right: R) -> Self::MergeResult { + EitherOrBoth::Right(right) + } + fn merge(&mut self, left: L, right: R) -> (Option>, Self::MergeResult) { + match self.0(&left, &right) { + Ordering::Equal => (None, EitherOrBoth::Both(left, right)), + Ordering::Less => (Some(Either::Right(right)), EitherOrBoth::Left(left)), + Ordering::Greater => (Some(Either::Left(left)), EitherOrBoth::Right(right)), } } - - fn size_hint(&self) -> (usize, Option) { - let (a_lower, a_upper) = self.left.size_hint(); - let (b_lower, b_upper) = self.right.size_hint(); - + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + let (a_lower, a_upper) = left; + let (b_lower, b_upper) = right; let lower = ::std::cmp::max(a_lower, b_lower); - let upper = match (a_upper, b_upper) { (Some(x), Some(y)) => x.checked_add(y), _ => None, }; - (lower, upper) } +} - fn count(mut self) -> usize { - let mut count = 0; - loop { - match (self.left.next(), self.right.next()) { - (None, None) => break count, - (Some(_left), None) => break count + 1 + self.left.into_parts().1.count(), - (None, Some(_right)) => break count + 1 + self.right.into_parts().1.count(), - (Some(left), Some(right)) => { - count += 1; - match (self.cmp_fn)(&left, &right) { - Ordering::Equal => {} - Ordering::Less => self.right.put_back(right), - Ordering::Greater => self.left.put_back(left), +impl bool> OrderingOrBool for MergeFuncLR { + type MergeResult = Either; + fn left(left: L) -> Self::MergeResult { + Either::Left(left) + } + fn right(right: R) -> Self::MergeResult { + Either::Right(right) + } + fn merge(&mut self, left: L, right: R) -> (Option>, Self::MergeResult) { + if self.0(&left, &right) { + (Some(Either::Right(right)), Either::Left(left)) + } else { + (Some(Either::Left(left)), Either::Right(right)) + } + } + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add(left, right) + } +} + +impl bool> OrderingOrBool for F { + type MergeResult = T; + fn left(left: T) -> Self::MergeResult { + left + } + fn right(right: T) -> Self::MergeResult { + right + } + fn merge(&mut self, left: T, right: T) -> (Option>, Self::MergeResult) { + if self(&left, &right) { + (Some(Either::Right(right)), left) + } else { + (Some(Either::Left(left)), right) + } + } + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add(left, right) + } +} + +impl OrderingOrBool for MergeLte { + type MergeResult = T; + fn left(left: T) -> Self::MergeResult { + left + } + fn right(right: T) -> Self::MergeResult { + right + } + fn merge(&mut self, left: T, right: T) -> (Option>, Self::MergeResult) { + if left <= right { + (Some(Either::Right(right)), left) + } else { + (Some(Either::Left(left)), right) + } + } + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add(left, right) + } +} + +impl Clone for MergeBy +where + I: Iterator, + J: Iterator, + PutBack>: Clone, + PutBack>: Clone, + F: Clone, +{ + clone_fields!(left, right, cmp_fn); +} + +impl fmt::Debug for MergeBy +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, + J: Iterator + fmt::Debug, + J::Item: fmt::Debug, +{ + debug_fmt_fields!(MergeBy, left, right); +} + +impl Iterator for MergeBy +where + I: Iterator, + J: Iterator, + F: OrderingOrBool, +{ + type Item = F::MergeResult; + + fn next(&mut self) -> Option { + match (self.left.next(), self.right.next()) { + (None, None) => None, + (Some(left), None) => Some(F::left(left)), + (None, Some(right)) => Some(F::right(right)), + (Some(left), Some(right)) => { + let (not_next, next) = self.cmp_fn.merge(left, right); + match not_next { + Some(Either::Left(l)) => { + self.left.put_back(l); } + Some(Either::Right(r)) => { + self.right.put_back(r); + } + None => (), } + + Some(next) } } } - fn last(mut self) -> Option { - let mut previous_element = None; + fn fold(mut self, init: B, mut f: G) -> B + where + Self: Sized, + G: FnMut(B, Self::Item) -> B, + { + let mut acc = init; + let mut left = self.left.next(); + let mut right = self.right.next(); + loop { - match (self.left.next(), self.right.next()) { - (None, None) => break previous_element, - (Some(left), None) => { - break Some(EitherOrBoth::Left( - self.left.into_parts().1.last().unwrap_or(left), - )) - } - (None, Some(right)) => { - break Some(EitherOrBoth::Right( - self.right.into_parts().1.last().unwrap_or(right), - )) - } - (Some(left), Some(right)) => { - previous_element = match (self.cmp_fn)(&left, &right) { - Ordering::Equal => Some(EitherOrBoth::Both(left, right)), - Ordering::Less => { - self.right.put_back(right); - Some(EitherOrBoth::Left(left)) - } - Ordering::Greater => { - self.left.put_back(left); - Some(EitherOrBoth::Right(right)) - } + match (left, right) { + (Some(l), Some(r)) => match self.cmp_fn.merge(l, r) { + (Some(Either::Right(r)), x) => { + acc = f(acc, x); + left = self.left.next(); + right = Some(r); } + (Some(Either::Left(l)), x) => { + acc = f(acc, x); + left = Some(l); + right = self.right.next(); + } + (None, x) => { + acc = f(acc, x); + left = self.left.next(); + right = self.right.next(); + } + }, + (Some(l), None) => { + self.left.put_back(l); + acc = self.left.fold(acc, |acc, x| f(acc, F::left(x))); + break; + } + (None, Some(r)) => { + self.right.put_back(r); + acc = self.right.fold(acc, |acc, x| f(acc, F::right(x))); + break; + } + (None, None) => { + break; } } } + + acc + } + + fn size_hint(&self) -> SizeHint { + F::size_hint(self.left.size_hint(), self.right.size_hint()) } fn nth(&mut self, mut n: usize) -> Option { @@ -156,14 +320,29 @@ impl Iterator for MergeJoinBy n -= 1; match (self.left.next(), self.right.next()) { (None, None) => break None, - (Some(_left), None) => break self.left.nth(n).map(EitherOrBoth::Left), - (None, Some(_right)) => break self.right.nth(n).map(EitherOrBoth::Right), - (Some(left), Some(right)) => match (self.cmp_fn)(&left, &right) { - Ordering::Equal => {} - Ordering::Less => self.right.put_back(right), - Ordering::Greater => self.left.put_back(left), - }, + (Some(_left), None) => break self.left.nth(n).map(F::left), + (None, Some(_right)) => break self.right.nth(n).map(F::right), + (Some(left), Some(right)) => { + let (not_next, _) = self.cmp_fn.merge(left, right); + match not_next { + Some(Either::Left(l)) => { + self.left.put_back(l); + } + Some(Either::Right(r)) => { + self.right.put_back(r); + } + None => (), + } + } } } } } + +impl FusedIterator for MergeBy +where + I: Iterator, + J: Iterator, + F: OrderingOrBool, +{ +} diff --git a/third_party/rust/itertools/src/minmax.rs b/third_party/rust/itertools/src/minmax.rs index 52b2f115ddd..5c9674e0112 100644 --- a/third_party/rust/itertools/src/minmax.rs +++ b/third_party/rust/itertools/src/minmax.rs @@ -1,8 +1,7 @@ - /// `MinMaxResult` is an enum returned by `minmax`. /// /// See [`.minmax()`](crate::Itertools::minmax) for more detail. -#[derive(Copy, Clone, PartialEq, Debug)] +#[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum MinMaxResult { /// Empty iterator NoElements, @@ -12,7 +11,7 @@ pub enum MinMaxResult { /// More than one element in the iterator, the first element is not larger /// than the second - MinMax(T, T) + MinMax(T, T), } impl MinMaxResult { @@ -36,34 +35,36 @@ impl MinMaxResult { /// let r = MinMax(1, 2); /// assert_eq!(r.into_option(), Some((1, 2))); /// ``` - pub fn into_option(self) -> Option<(T,T)> { + pub fn into_option(self) -> Option<(T, T)> { match self { - MinMaxResult::NoElements => None, - MinMaxResult::OneElement(x) => Some((x.clone(), x)), - MinMaxResult::MinMax(x, y) => Some((x, y)) + Self::NoElements => None, + Self::OneElement(x) => Some((x.clone(), x)), + Self::MinMax(x, y) => Some((x, y)), } } } /// Implementation guts for `minmax` and `minmax_by_key`. -pub fn minmax_impl(mut it: I, mut key_for: F, - mut lt: L) -> MinMaxResult - where I: Iterator, - F: FnMut(&I::Item) -> K, - L: FnMut(&I::Item, &I::Item, &K, &K) -> bool, +pub fn minmax_impl(mut it: I, mut key_for: F, mut lt: L) -> MinMaxResult +where + I: Iterator, + F: FnMut(&I::Item) -> K, + L: FnMut(&I::Item, &I::Item, &K, &K) -> bool, { let (mut min, mut max, mut min_key, mut max_key) = match it.next() { None => return MinMaxResult::NoElements, - Some(x) => { - match it.next() { - None => return MinMaxResult::OneElement(x), - Some(y) => { - let xk = key_for(&x); - let yk = key_for(&y); - if !lt(&y, &x, &yk, &xk) {(x, y, xk, yk)} else {(y, x, yk, xk)} + Some(x) => match it.next() { + None => return MinMaxResult::OneElement(x), + Some(y) => { + let xk = key_for(&x); + let yk = key_for(&y); + if !lt(&y, &x, &yk, &xk) { + (x, y, xk, yk) + } else { + (y, x, yk, xk) } } - } + }, }; loop { @@ -74,7 +75,7 @@ pub fn minmax_impl(mut it: I, mut key_for: F, // for 2 elements. let first = match it.next() { None => break, - Some(x) => x + Some(x) => x, }; let second = match it.next() { None => { @@ -86,7 +87,7 @@ pub fn minmax_impl(mut it: I, mut key_for: F, } break; } - Some(x) => x + Some(x) => x, }; let first_key = key_for(&first); let second_key = key_for(&second); diff --git a/third_party/rust/itertools/src/multipeek_impl.rs b/third_party/rust/itertools/src/multipeek_impl.rs index 8b49c695eb0..6f800b6fb6c 100644 --- a/third_party/rust/itertools/src/multipeek_impl.rs +++ b/third_party/rust/itertools/src/multipeek_impl.rs @@ -1,14 +1,16 @@ -use std::iter::Fuse; -use alloc::collections::VecDeque; use crate::size_hint; -use crate::PeekingNext; #[cfg(doc)] use crate::Itertools; +use crate::PeekingNext; +use alloc::collections::VecDeque; +use std::iter::Fuse; /// See [`multipeek()`] for more information. #[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct MultiPeek - where I: Iterator +where + I: Iterator, { iter: Fuse, buf: VecDeque, @@ -20,7 +22,8 @@ pub struct MultiPeek /// /// [`IntoIterator`] enabled version of [`Itertools::multipeek`]. pub fn multipeek(iterable: I) -> MultiPeek - where I: IntoIterator +where + I: IntoIterator, { MultiPeek { iter: iterable.into_iter().fuse(), @@ -30,7 +33,8 @@ pub fn multipeek(iterable: I) -> MultiPeek } impl MultiPeek - where I: Iterator +where + I: Iterator, { /// Reset the peeking “cursor” pub fn reset_peek(&mut self) { @@ -62,24 +66,31 @@ impl MultiPeek { } impl PeekingNext for MultiPeek - where I: Iterator, +where + I: Iterator, { fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool + where + F: FnOnce(&Self::Item) -> bool, { if self.buf.is_empty() { if let Some(r) = self.peek() { - if !accept(r) { return None } + if !accept(r) { + return None; + } + } + } else if let Some(r) = self.buf.front() { + if !accept(r) { + return None; } - } else if let Some(r) = self.buf.get(0) { - if !accept(r) { return None } } self.next() } } impl Iterator for MultiPeek - where I: Iterator +where + I: Iterator, { type Item = I::Item; @@ -91,11 +102,15 @@ impl Iterator for MultiPeek fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.iter.size_hint(), self.buf.len()) } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + init = self.buf.into_iter().fold(init, &mut f); + self.iter.fold(init, f) + } } // Same size -impl ExactSizeIterator for MultiPeek - where I: ExactSizeIterator -{} - - +impl ExactSizeIterator for MultiPeek where I: ExactSizeIterator {} diff --git a/third_party/rust/itertools/src/next_array.rs b/third_party/rust/itertools/src/next_array.rs new file mode 100644 index 00000000000..86480b19740 --- /dev/null +++ b/third_party/rust/itertools/src/next_array.rs @@ -0,0 +1,269 @@ +use core::mem::{self, MaybeUninit}; + +/// An array of at most `N` elements. +struct ArrayBuilder { + /// The (possibly uninitialized) elements of the `ArrayBuilder`. + /// + /// # Safety + /// + /// The elements of `arr[..len]` are valid `T`s. + arr: [MaybeUninit; N], + + /// The number of leading elements of `arr` that are valid `T`s, len <= N. + len: usize, +} + +impl ArrayBuilder { + /// Initializes a new, empty `ArrayBuilder`. + pub fn new() -> Self { + // SAFETY: The safety invariant of `arr` trivially holds for `len = 0`. + Self { + arr: [(); N].map(|_| MaybeUninit::uninit()), + len: 0, + } + } + + /// Pushes `value` onto the end of the array. + /// + /// # Panics + /// + /// This panics if `self.len >= N`. + #[inline(always)] + pub fn push(&mut self, value: T) { + // PANICS: This will panic if `self.len >= N`. + let place = &mut self.arr[self.len]; + // SAFETY: The safety invariant of `self.arr` applies to elements at + // indices `0..self.len` — not to the element at `self.len`. Writing to + // the element at index `self.len` therefore does not violate the safety + // invariant of `self.arr`. Even if this line panics, we have not + // created any intermediate invalid state. + *place = MaybeUninit::new(value); + // Lemma: `self.len < N`. By invariant, `self.len <= N`. Above, we index + // into `self.arr`, which has size `N`, at index `self.len`. If `self.len == N` + // at that point, that index would be out-of-bounds, and the index + // operation would panic. Thus, `self.len != N`, and since `self.len <= N`, + // that means that `self.len < N`. + // + // PANICS: Since `self.len < N`, and since `N <= usize::MAX`, + // `self.len + 1 <= usize::MAX`, and so `self.len += 1` will not + // overflow. Overflow is the only panic condition of `+=`. + // + // SAFETY: + // - We are required to uphold the invariant that `self.len <= N`. + // Since, by the preceding lemma, `self.len < N` at this point in the + // code, `self.len += 1` results in `self.len <= N`. + // - We are required to uphold the invariant that `self.arr[..self.len]` + // are valid instances of `T`. Since this invariant already held when + // this method was called, and since we only increment `self.len` + // by 1 here, we only need to prove that the element at + // `self.arr[self.len]` (using the value of `self.len` before incrementing) + // is valid. Above, we construct `place` to point to `self.arr[self.len]`, + // and then initialize `*place` to `MaybeUninit::new(value)`, which is + // a valid `T` by construction. + self.len += 1; + } + + /// Consumes the elements in the `ArrayBuilder` and returns them as an array + /// `[T; N]`. + /// + /// If `self.len() < N`, this returns `None`. + pub fn take(&mut self) -> Option<[T; N]> { + if self.len == N { + // SAFETY: Decreasing the value of `self.len` cannot violate the + // safety invariant on `self.arr`. + self.len = 0; + + // SAFETY: Since `self.len` is 0, `self.arr` may safely contain + // uninitialized elements. + let arr = mem::replace(&mut self.arr, [(); N].map(|_| MaybeUninit::uninit())); + + Some(arr.map(|v| { + // SAFETY: We know that all elements of `arr` are valid because + // we checked that `len == N`. + unsafe { v.assume_init() } + })) + } else { + None + } + } +} + +impl AsMut<[T]> for ArrayBuilder { + fn as_mut(&mut self) -> &mut [T] { + let valid = &mut self.arr[..self.len]; + // SAFETY: By invariant on `self.arr`, the elements of `self.arr` at + // indices `0..self.len` are in a valid state. Since `valid` references + // only these elements, the safety precondition of + // `slice_assume_init_mut` is satisfied. + unsafe { slice_assume_init_mut(valid) } + } +} + +impl Drop for ArrayBuilder { + // We provide a non-trivial `Drop` impl, because the trivial impl would be a + // no-op; `MaybeUninit` has no innate awareness of its own validity, and + // so it can only forget its contents. By leveraging the safety invariant of + // `self.arr`, we do know which elements of `self.arr` are valid, and can + // selectively run their destructors. + fn drop(&mut self) { + // SAFETY: + // - by invariant on `&mut [T]`, `self.as_mut()` is: + // - valid for reads and writes + // - properly aligned + // - non-null + // - the dropped `T` are valid for dropping; they do not have any + // additional library invariants that we've violated + // - no other pointers to `valid` exist (since we're in the context of + // `drop`) + unsafe { core::ptr::drop_in_place(self.as_mut()) } + } +} + +/// Assuming all the elements are initialized, get a mutable slice to them. +/// +/// # Safety +/// +/// The caller guarantees that the elements `T` referenced by `slice` are in a +/// valid state. +unsafe fn slice_assume_init_mut(slice: &mut [MaybeUninit]) -> &mut [T] { + // SAFETY: Casting `&mut [MaybeUninit]` to `&mut [T]` is sound, because + // `MaybeUninit` is guaranteed to have the same size, alignment and ABI + // as `T`, and because the caller has guaranteed that `slice` is in the + // valid state. + unsafe { &mut *(slice as *mut [MaybeUninit] as *mut [T]) } +} + +/// Equivalent to `it.next_array()`. +pub(crate) fn next_array(it: &mut I) -> Option<[I::Item; N]> +where + I: Iterator, +{ + let mut builder = ArrayBuilder::new(); + for _ in 0..N { + builder.push(it.next()?); + } + builder.take() +} + +#[cfg(test)] +mod test { + use super::ArrayBuilder; + + #[test] + fn zero_len_take() { + let mut builder = ArrayBuilder::<(), 0>::new(); + let taken = builder.take(); + assert_eq!(taken, Some([(); 0])); + } + + #[test] + #[should_panic] + fn zero_len_push() { + let mut builder = ArrayBuilder::<(), 0>::new(); + builder.push(()); + } + + #[test] + fn push_4() { + let mut builder = ArrayBuilder::<(), 4>::new(); + assert_eq!(builder.take(), None); + + builder.push(()); + assert_eq!(builder.take(), None); + + builder.push(()); + assert_eq!(builder.take(), None); + + builder.push(()); + assert_eq!(builder.take(), None); + + builder.push(()); + assert_eq!(builder.take(), Some([(); 4])); + } + + #[test] + fn tracked_drop() { + use std::panic::{catch_unwind, AssertUnwindSafe}; + use std::sync::atomic::{AtomicU16, Ordering}; + + static DROPPED: AtomicU16 = AtomicU16::new(0); + + #[derive(Debug, PartialEq)] + struct TrackedDrop; + + impl Drop for TrackedDrop { + fn drop(&mut self) { + DROPPED.fetch_add(1, Ordering::Relaxed); + } + } + + { + let builder = ArrayBuilder::::new(); + assert_eq!(DROPPED.load(Ordering::Relaxed), 0); + drop(builder); + assert_eq!(DROPPED.load(Ordering::Relaxed), 0); + } + + { + let mut builder = ArrayBuilder::::new(); + builder.push(TrackedDrop); + assert_eq!(builder.take(), None); + assert_eq!(DROPPED.load(Ordering::Relaxed), 0); + drop(builder); + assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 1); + } + + { + let mut builder = ArrayBuilder::::new(); + builder.push(TrackedDrop); + builder.push(TrackedDrop); + assert!(matches!(builder.take(), Some(_))); + assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 2); + drop(builder); + assert_eq!(DROPPED.load(Ordering::Relaxed), 0); + } + + { + let mut builder = ArrayBuilder::::new(); + + builder.push(TrackedDrop); + builder.push(TrackedDrop); + + assert!(catch_unwind(AssertUnwindSafe(|| { + builder.push(TrackedDrop); + })) + .is_err()); + + assert_eq!(DROPPED.load(Ordering::Relaxed), 1); + + drop(builder); + + assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 3); + } + + { + let mut builder = ArrayBuilder::::new(); + + builder.push(TrackedDrop); + builder.push(TrackedDrop); + + assert!(catch_unwind(AssertUnwindSafe(|| { + builder.push(TrackedDrop); + })) + .is_err()); + + assert_eq!(DROPPED.load(Ordering::Relaxed), 1); + + assert!(matches!(builder.take(), Some(_))); + + assert_eq!(DROPPED.load(Ordering::Relaxed), 3); + + builder.push(TrackedDrop); + builder.push(TrackedDrop); + + assert!(matches!(builder.take(), Some(_))); + + assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 5); + } + } +} diff --git a/third_party/rust/itertools/src/pad_tail.rs b/third_party/rust/itertools/src/pad_tail.rs index 248a4324368..5595b42bacf 100644 --- a/third_party/rust/itertools/src/pad_tail.rs +++ b/third_party/rust/itertools/src/pad_tail.rs @@ -1,5 +1,5 @@ -use std::iter::{Fuse, FusedIterator}; use crate::size_hint; +use std::iter::{Fuse, FusedIterator}; /// An iterator adaptor that pads a sequence to a minimum length by filling /// missing elements using a closure. @@ -25,8 +25,9 @@ where /// Create a new `PadUsing` iterator. pub fn pad_using(iter: I, min: usize, filler: F) -> PadUsing - where I: Iterator, - F: FnMut(usize) -> I::Item +where + I: Iterator, + F: FnMut(usize) -> I::Item, { PadUsing { iter: iter.fuse(), @@ -37,8 +38,9 @@ pub fn pad_using(iter: I, min: usize, filler: F) -> PadUsing } impl Iterator for PadUsing - where I: Iterator, - F: FnMut(usize) -> I::Item +where + I: Iterator, + F: FnMut(usize) -> I::Item, { type Item = I::Item; @@ -53,7 +55,7 @@ impl Iterator for PadUsing } else { None } - }, + } e => { self.pos += 1; e @@ -65,11 +67,24 @@ impl Iterator for PadUsing let tail = self.min.saturating_sub(self.pos); size_hint::max(self.iter.size_hint(), (tail, Some(tail))) } + + fn fold(self, mut init: B, mut f: G) -> B + where + G: FnMut(B, Self::Item) -> B, + { + let mut pos = self.pos; + init = self.iter.fold(init, |acc, item| { + pos += 1; + f(acc, item) + }); + (pos..self.min).map(self.filler).fold(init, f) + } } impl DoubleEndedIterator for PadUsing - where I: DoubleEndedIterator + ExactSizeIterator, - F: FnMut(usize) -> I::Item +where + I: DoubleEndedIterator + ExactSizeIterator, + F: FnMut(usize) -> I::Item, { fn next_back(&mut self) -> Option { if self.min == 0 { @@ -82,15 +97,28 @@ impl DoubleEndedIterator for PadUsing Some((self.filler)(self.min)) } } + + fn rfold(self, mut init: B, mut f: G) -> B + where + G: FnMut(B, Self::Item) -> B, + { + init = (self.iter.len()..self.min) + .map(self.filler) + .rfold(init, &mut f); + self.iter.rfold(init, f) + } } impl ExactSizeIterator for PadUsing - where I: ExactSizeIterator, - F: FnMut(usize) -> I::Item -{} - +where + I: ExactSizeIterator, + F: FnMut(usize) -> I::Item, +{ +} impl FusedIterator for PadUsing - where I: FusedIterator, - F: FnMut(usize) -> I::Item -{} +where + I: FusedIterator, + F: FnMut(usize) -> I::Item, +{ +} diff --git a/third_party/rust/itertools/src/peek_nth.rs b/third_party/rust/itertools/src/peek_nth.rs index bcca45838eb..b03a3ef5f2a 100644 --- a/third_party/rust/itertools/src/peek_nth.rs +++ b/third_party/rust/itertools/src/peek_nth.rs @@ -5,6 +5,7 @@ use std::iter::Fuse; /// See [`peek_nth()`] for more information. #[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct PeekNth where I: Iterator, @@ -34,30 +35,35 @@ impl PeekNth where I: Iterator, { - /// Works exactly like the `peek` method in `std::iter::Peekable` + /// Works exactly like the `peek` method in [`std::iter::Peekable`]. pub fn peek(&mut self) -> Option<&I::Item> { self.peek_nth(0) } + /// Works exactly like the `peek_mut` method in [`std::iter::Peekable`]. + pub fn peek_mut(&mut self) -> Option<&mut I::Item> { + self.peek_nth_mut(0) + } + /// Returns a reference to the `nth` value without advancing the iterator. /// /// # Examples /// /// Basic usage: /// - /// ```rust + /// ``` /// use itertools::peek_nth; /// - /// let xs = vec![1,2,3]; - /// let mut iter = peek_nth(xs.iter()); + /// let xs = vec![1, 2, 3]; + /// let mut iter = peek_nth(xs.into_iter()); /// - /// assert_eq!(iter.peek_nth(0), Some(&&1)); - /// assert_eq!(iter.next(), Some(&1)); + /// assert_eq!(iter.peek_nth(0), Some(&1)); + /// assert_eq!(iter.next(), Some(1)); /// /// // The iterator does not advance even if we call `peek_nth` multiple times - /// assert_eq!(iter.peek_nth(0), Some(&&2)); - /// assert_eq!(iter.peek_nth(1), Some(&&3)); - /// assert_eq!(iter.next(), Some(&2)); + /// assert_eq!(iter.peek_nth(0), Some(&2)); + /// assert_eq!(iter.peek_nth(1), Some(&3)); + /// assert_eq!(iter.next(), Some(2)); /// /// // Calling `peek_nth` past the end of the iterator will return `None` /// assert_eq!(iter.peek_nth(1), None); @@ -69,6 +75,68 @@ where self.buf.get(n) } + + /// Returns a mutable reference to the `nth` value without advancing the iterator. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use itertools::peek_nth; + /// + /// let xs = vec![1, 2, 3, 4, 5]; + /// let mut iter = peek_nth(xs.into_iter()); + /// + /// assert_eq!(iter.peek_nth_mut(0), Some(&mut 1)); + /// assert_eq!(iter.next(), Some(1)); + /// + /// // The iterator does not advance even if we call `peek_nth_mut` multiple times + /// assert_eq!(iter.peek_nth_mut(0), Some(&mut 2)); + /// assert_eq!(iter.peek_nth_mut(1), Some(&mut 3)); + /// assert_eq!(iter.next(), Some(2)); + /// + /// // Peek into the iterator and set the value behind the mutable reference. + /// if let Some(p) = iter.peek_nth_mut(1) { + /// assert_eq!(*p, 4); + /// *p = 9; + /// } + /// + /// // The value we put in reappears as the iterator continues. + /// assert_eq!(iter.next(), Some(3)); + /// assert_eq!(iter.next(), Some(9)); + /// + /// // Calling `peek_nth_mut` past the end of the iterator will return `None` + /// assert_eq!(iter.peek_nth_mut(1), None); + /// ``` + pub fn peek_nth_mut(&mut self, n: usize) -> Option<&mut I::Item> { + let unbuffered_items = (n + 1).saturating_sub(self.buf.len()); + + self.buf.extend(self.iter.by_ref().take(unbuffered_items)); + + self.buf.get_mut(n) + } + + /// Works exactly like the `next_if` method in [`std::iter::Peekable`]. + pub fn next_if(&mut self, func: impl FnOnce(&I::Item) -> bool) -> Option { + match self.next() { + Some(item) if func(&item) => Some(item), + Some(item) => { + self.buf.push_front(item); + None + } + _ => None, + } + } + + /// Works exactly like the `next_if_eq` method in [`std::iter::Peekable`]. + pub fn next_if_eq(&mut self, expected: &T) -> Option + where + T: ?Sized, + I::Item: PartialEq, + { + self.next_if(|next| next == expected) + } } impl Iterator for PeekNth @@ -84,6 +152,14 @@ where fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.iter.size_hint(), self.buf.len()) } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + init = self.buf.into_iter().fold(init, &mut f); + self.iter.fold(init, f) + } } impl ExactSizeIterator for PeekNth where I: ExactSizeIterator {} diff --git a/third_party/rust/itertools/src/peeking_take_while.rs b/third_party/rust/itertools/src/peeking_take_while.rs index b3a9c5ccb46..f3259a91901 100644 --- a/third_party/rust/itertools/src/peeking_take_while.rs +++ b/third_party/rust/itertools/src/peeking_take_while.rs @@ -1,7 +1,8 @@ -use std::iter::Peekable; use crate::PutBack; #[cfg(feature = "use_alloc")] use crate::PutBackN; +use crate::RepeatN; +use std::iter::Peekable; /// An iterator that allows peeking at an element before deciding to accept it. /// @@ -10,20 +11,36 @@ use crate::PutBackN; /// /// This is implemented by peeking adaptors like peekable and put back, /// but also by a few iterators that can be peeked natively, like the slice’s -/// by reference iterator (`std::slice::Iter`). -pub trait PeekingNext : Iterator { +/// by reference iterator ([`std::slice::Iter`]). +pub trait PeekingNext: Iterator { /// Pass a reference to the next iterator element to the closure `accept`; - /// if `accept` returns true, return it as the next element, - /// else None. + /// if `accept` returns `true`, return it as the next element, + /// else `None`. fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool; + where + Self: Sized, + F: FnOnce(&Self::Item) -> bool; +} + +impl PeekingNext for &mut I +where + I: PeekingNext, +{ + fn peeking_next(&mut self, accept: F) -> Option + where + F: FnOnce(&Self::Item) -> bool, + { + (*self).peeking_next(accept) + } } impl PeekingNext for Peekable - where I: Iterator, +where + I: Iterator, { fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool + where + F: FnOnce(&Self::Item) -> bool, { if let Some(r) = self.peek() { if !accept(r) { @@ -35,10 +52,12 @@ impl PeekingNext for Peekable } impl PeekingNext for PutBack - where I: Iterator, +where + I: Iterator, { fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool + where + F: FnOnce(&Self::Item) -> bool, { if let Some(r) = self.next() { if !accept(&r) { @@ -54,10 +73,12 @@ impl PeekingNext for PutBack #[cfg(feature = "use_alloc")] impl PeekingNext for PutBackN - where I: Iterator, +where + I: Iterator, { fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool + where + F: FnOnce(&Self::Item) -> bool, { if let Some(r) = self.next() { if !accept(&r) { @@ -71,39 +92,51 @@ impl PeekingNext for PutBackN } } +impl PeekingNext for RepeatN { + fn peeking_next(&mut self, accept: F) -> Option + where + F: FnOnce(&Self::Item) -> bool, + { + let r = self.elt.as_ref()?; + if !accept(r) { + return None; + } + self.next() + } +} + /// An iterator adaptor that takes items while a closure returns `true`. /// /// See [`.peeking_take_while()`](crate::Itertools::peeking_take_while) /// for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct PeekingTakeWhile<'a, I: 'a, F> - where I: Iterator, +pub struct PeekingTakeWhile<'a, I, F> +where + I: Iterator + 'a, { iter: &'a mut I, f: F, } -impl<'a, I: 'a, F> std::fmt::Debug for PeekingTakeWhile<'a, I, F> +impl<'a, I, F> std::fmt::Debug for PeekingTakeWhile<'a, I, F> where - I: Iterator + std::fmt::Debug, + I: Iterator + std::fmt::Debug + 'a, { debug_fmt_fields!(PeekingTakeWhile, iter); } /// Create a `PeekingTakeWhile` pub fn peeking_take_while(iter: &mut I, f: F) -> PeekingTakeWhile - where I: Iterator, +where + I: Iterator, { - PeekingTakeWhile { - iter, - f, - } + PeekingTakeWhile { iter, f } } -impl<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F> - where I: PeekingNext, - F: FnMut(&I::Item) -> bool, - +impl Iterator for PeekingTakeWhile<'_, I, F> +where + I: PeekingNext, + F: FnMut(&I::Item) -> bool, { type Item = I::Item; fn next(&mut self) -> Option { @@ -115,6 +148,20 @@ impl<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F> } } +impl PeekingNext for PeekingTakeWhile<'_, I, F> +where + I: PeekingNext, + F: FnMut(&I::Item) -> bool, +{ + fn peeking_next(&mut self, g: G) -> Option + where + G: FnOnce(&Self::Item) -> bool, + { + let f = &mut self.f; + self.iter.peeking_next(|r| f(r) && g(r)) + } +} + // Some iterators are so lightweight we can simply clone them to save their // state and use that for peeking. macro_rules! peeking_next_by_clone { @@ -151,4 +198,4 @@ peeking_next_by_clone! { ['a, T] alloc::collections::vec_deque::Iter<'a, T> } // cloning a Rev has no extra overhead; peekable and put backs are never DEI. peeking_next_by_clone! { [I: Clone + PeekingNext + DoubleEndedIterator] - ::std::iter::Rev } +::std::iter::Rev } diff --git a/third_party/rust/itertools/src/permutations.rs b/third_party/rust/itertools/src/permutations.rs index d03b852626c..91389a73a75 100644 --- a/third_party/rust/itertools/src/permutations.rs +++ b/third_party/rust/itertools/src/permutations.rs @@ -1,8 +1,11 @@ +use alloc::boxed::Box; use alloc::vec::Vec; use std::fmt; use std::iter::once; +use std::iter::FusedIterator; use super::lazy_buffer::LazyBuffer; +use crate::size_hint::{self, SizeHint}; /// An iterator adaptor that iterates through all the `k`-permutations of the /// elements from an iterator. @@ -16,262 +19,168 @@ pub struct Permutations { } impl Clone for Permutations - where I: Clone + Iterator, - I::Item: Clone, +where + I: Clone + Iterator, + I::Item: Clone, { clone_fields!(vals, state); } #[derive(Clone, Debug)] enum PermutationState { - StartUnknownLen { - k: usize, + /// No permutation generated yet. + Start { k: usize }, + /// Values from the iterator are not fully loaded yet so `n` is still unknown. + Buffered { k: usize, min_n: usize }, + /// All values from the iterator are known so `n` is known. + Loaded { + indices: Box<[usize]>, + cycles: Box<[usize]>, }, - OngoingUnknownLen { - k: usize, - min_n: usize, - }, - Complete(CompleteState), - Empty, -} - -#[derive(Clone, Debug)] -enum CompleteState { - Start { - n: usize, - k: usize, - }, - Ongoing { - indices: Vec, - cycles: Vec, - } -} - -enum CompleteStateRemaining { - Known(usize), - Overflow, + /// No permutation left to generate. + End, } impl fmt::Debug for Permutations - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, { debug_fmt_fields!(Permutations, vals, state); } pub fn permutations(iter: I, k: usize) -> Permutations { - let mut vals = LazyBuffer::new(iter); - - if k == 0 { - // Special case, yields single empty vec; `n` is irrelevant - let state = PermutationState::Complete(CompleteState::Start { n: 0, k: 0 }); - - return Permutations { - vals, - state - }; - } - - let mut enough_vals = true; - - while vals.len() < k { - if !vals.get_next() { - enough_vals = false; - break; - } - } - - let state = if enough_vals { - PermutationState::StartUnknownLen { k } - } else { - PermutationState::Empty - }; - Permutations { - vals, - state + vals: LazyBuffer::new(iter), + state: PermutationState::Start { k }, } } impl Iterator for Permutations where I: Iterator, - I::Item: Clone + I::Item: Clone, { type Item = Vec; fn next(&mut self) -> Option { - self.advance(); - - let &mut Permutations { ref vals, ref state } = self; - - match *state { - PermutationState::StartUnknownLen { .. } => panic!("unexpected iterator state"), - PermutationState::OngoingUnknownLen { k, min_n } => { - let latest_idx = min_n - 1; - let indices = (0..(k - 1)).chain(once(latest_idx)); - - Some(indices.map(|i| vals[i].clone()).collect()) + let Self { vals, state } = self; + match state { + PermutationState::Start { k: 0 } => { + *state = PermutationState::End; + Some(Vec::new()) } - PermutationState::Complete(CompleteState::Ongoing { ref indices, ref cycles }) => { + &mut PermutationState::Start { k } => { + vals.prefill(k); + if vals.len() != k { + *state = PermutationState::End; + return None; + } + *state = PermutationState::Buffered { k, min_n: k }; + Some(vals[0..k].to_vec()) + } + PermutationState::Buffered { ref k, min_n } => { + if vals.get_next() { + let item = (0..*k - 1) + .chain(once(*min_n)) + .map(|i| vals[i].clone()) + .collect(); + *min_n += 1; + Some(item) + } else { + let n = *min_n; + let prev_iteration_count = n - *k + 1; + let mut indices: Box<[_]> = (0..n).collect(); + let mut cycles: Box<[_]> = (n - k..n).rev().collect(); + // Advance the state to the correct point. + for _ in 0..prev_iteration_count { + if advance(&mut indices, &mut cycles) { + *state = PermutationState::End; + return None; + } + } + let item = vals.get_at(&indices[0..*k]); + *state = PermutationState::Loaded { indices, cycles }; + Some(item) + } + } + PermutationState::Loaded { indices, cycles } => { + if advance(indices, cycles) { + *state = PermutationState::End; + return None; + } let k = cycles.len(); - Some(indices[0..k].iter().map(|&i| vals[i].clone()).collect()) - }, - PermutationState::Complete(CompleteState::Start { .. }) | PermutationState::Empty => None + Some(vals.get_at(&indices[0..k])) + } + PermutationState::End => None, } } fn count(self) -> usize { - fn from_complete(complete_state: CompleteState) -> usize { - match complete_state.remaining() { - CompleteStateRemaining::Known(count) => count, - CompleteStateRemaining::Overflow => { - panic!("Iterator count greater than usize::MAX"); - } - } - } - - let Permutations { vals, state } = self; - match state { - PermutationState::StartUnknownLen { k } => { - let n = vals.len() + vals.it.count(); - let complete_state = CompleteState::Start { n, k }; - - from_complete(complete_state) - } - PermutationState::OngoingUnknownLen { k, min_n } => { - let prev_iteration_count = min_n - k + 1; - let n = vals.len() + vals.it.count(); - let complete_state = CompleteState::Start { n, k }; - - from_complete(complete_state) - prev_iteration_count - }, - PermutationState::Complete(state) => from_complete(state), - PermutationState::Empty => 0 - } + let Self { vals, state } = self; + let n = vals.count(); + state.size_hint_for(n).1.unwrap() } - fn size_hint(&self) -> (usize, Option) { - match self.state { - PermutationState::StartUnknownLen { .. } | - PermutationState::OngoingUnknownLen { .. } => (0, None), // TODO can we improve this lower bound? - PermutationState::Complete(ref state) => match state.remaining() { - CompleteStateRemaining::Known(count) => (count, Some(count)), - CompleteStateRemaining::Overflow => (::std::usize::MAX, None) - } - PermutationState::Empty => (0, Some(0)) - } + fn size_hint(&self) -> SizeHint { + let (mut low, mut upp) = self.vals.size_hint(); + low = self.state.size_hint_for(low).0; + upp = upp.and_then(|n| self.state.size_hint_for(n).1); + (low, upp) } } -impl Permutations +impl FusedIterator for Permutations where I: Iterator, - I::Item: Clone + I::Item: Clone, { - fn advance(&mut self) { - let &mut Permutations { ref mut vals, ref mut state } = self; +} - *state = match *state { - PermutationState::StartUnknownLen { k } => { - PermutationState::OngoingUnknownLen { k, min_n: k } - } - PermutationState::OngoingUnknownLen { k, min_n } => { - if vals.get_next() { - PermutationState::OngoingUnknownLen { k, min_n: min_n + 1 } - } else { - let n = min_n; - let prev_iteration_count = n - k + 1; - let mut complete_state = CompleteState::Start { n, k }; +fn advance(indices: &mut [usize], cycles: &mut [usize]) -> bool { + let n = indices.len(); + let k = cycles.len(); + // NOTE: if `cycles` are only zeros, then we reached the last permutation. + for i in (0..k).rev() { + if cycles[i] == 0 { + cycles[i] = n - i - 1; + indices[i..].rotate_left(1); + } else { + let swap_index = n - cycles[i]; + indices.swap(i, swap_index); + cycles[i] -= 1; + return false; + } + } + true +} - // Advance the complete-state iterator to the correct point - for _ in 0..(prev_iteration_count + 1) { - complete_state.advance(); - } - - PermutationState::Complete(complete_state) - } - } - PermutationState::Complete(ref mut state) => { - state.advance(); - - return; - } - PermutationState::Empty => { return; } +impl PermutationState { + fn size_hint_for(&self, n: usize) -> SizeHint { + // At the beginning, there are `n!/(n-k)!` items to come. + let at_start = |n, k| { + debug_assert!(n >= k); + let total = (n - k + 1..=n).try_fold(1usize, |acc, i| acc.checked_mul(i)); + (total.unwrap_or(usize::MAX), total) }; - } -} - -impl CompleteState { - fn advance(&mut self) { - *self = match *self { - CompleteState::Start { n, k } => { - let indices = (0..n).collect(); - let cycles = ((n - k)..n).rev().collect(); - - CompleteState::Ongoing { - cycles, - indices - } - }, - CompleteState::Ongoing { ref mut indices, ref mut cycles } => { - let n = indices.len(); - let k = cycles.len(); - - for i in (0..k).rev() { - if cycles[i] == 0 { - cycles[i] = n - i - 1; - - let to_push = indices.remove(i); - indices.push(to_push); - } else { - let swap_index = n - cycles[i]; - indices.swap(i, swap_index); - - cycles[i] -= 1; - return; - } - } - - CompleteState::Start { n, k } - } - } - } - - fn remaining(&self) -> CompleteStateRemaining { - use self::CompleteStateRemaining::{Known, Overflow}; - match *self { - CompleteState::Start { n, k } => { - if n < k { - return Known(0); - } - - let count: Option = (n - k + 1..n + 1).fold(Some(1), |acc, i| { - acc.and_then(|acc| acc.checked_mul(i)) + Self::Start { k } if n < k => (0, Some(0)), + Self::Start { k } => at_start(n, k), + Self::Buffered { k, min_n } => { + // Same as `Start` minus the previously generated items. + size_hint::sub_scalar(at_start(n, k), min_n - k + 1) + } + Self::Loaded { + ref indices, + ref cycles, + } => { + let count = cycles.iter().enumerate().try_fold(0usize, |acc, (i, &c)| { + acc.checked_mul(indices.len() - i) + .and_then(|count| count.checked_add(c)) }); - - match count { - Some(count) => Known(count), - None => Overflow - } - } - CompleteState::Ongoing { ref indices, ref cycles } => { - let mut count: usize = 0; - - for (i, &c) in cycles.iter().enumerate() { - let radix = indices.len() - i; - let next_count = count.checked_mul(radix) - .and_then(|count| count.checked_add(c)); - - count = match next_count { - Some(count) => count, - None => { return Overflow; } - }; - } - - Known(count) + (count.unwrap_or(usize::MAX), count) } + Self::End => (0, Some(0)), } } } diff --git a/third_party/rust/itertools/src/powerset.rs b/third_party/rust/itertools/src/powerset.rs index 4d7685b12a8..734eaf6149a 100644 --- a/third_party/rust/itertools/src/powerset.rs +++ b/third_party/rust/itertools/src/powerset.rs @@ -1,10 +1,10 @@ +use alloc::vec::Vec; use std::fmt; use std::iter::FusedIterator; -use std::usize; -use alloc::vec::Vec; -use super::combinations::{Combinations, combinations}; -use super::size_hint; +use super::combinations::{combinations, Combinations}; +use crate::adaptors::checked_binomial; +use crate::size_hint::{self, SizeHint}; /// An iterator to iterate through the powerset of the elements from an iterator. /// @@ -13,78 +13,119 @@ use super::size_hint; #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Powerset { combs: Combinations, - // Iterator `position` (equal to count of yielded elements). - pos: usize, } impl Clone for Powerset - where I: Clone + Iterator, - I::Item: Clone, +where + I: Clone + Iterator, + I::Item: Clone, { - clone_fields!(combs, pos); + clone_fields!(combs); } impl fmt::Debug for Powerset - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, { - debug_fmt_fields!(Powerset, combs, pos); + debug_fmt_fields!(Powerset, combs); } /// Create a new `Powerset` from a clonable iterator. pub fn powerset(src: I) -> Powerset - where I: Iterator, - I::Item: Clone, +where + I: Iterator, + I::Item: Clone, { Powerset { combs: combinations(src, 0), - pos: 0, + } +} + +impl Powerset { + /// Returns true if `k` has been incremented, false otherwise. + fn increment_k(&mut self) -> bool { + if self.combs.k() < self.combs.n() || self.combs.k() == 0 { + self.combs.reset(self.combs.k() + 1); + true + } else { + false + } } } impl Iterator for Powerset - where - I: Iterator, - I::Item: Clone, +where + I: Iterator, + I::Item: Clone, { type Item = Vec; fn next(&mut self) -> Option { if let Some(elt) = self.combs.next() { - self.pos = self.pos.saturating_add(1); Some(elt) - } else if self.combs.k() < self.combs.n() - || self.combs.k() == 0 - { - self.combs.reset(self.combs.k() + 1); - self.combs.next().map(|elt| { - self.pos = self.pos.saturating_add(1); - elt - }) + } else if self.increment_k() { + self.combs.next() } else { None } } - fn size_hint(&self) -> (usize, Option) { - // Total bounds for source iterator. - let src_total = size_hint::add_scalar(self.combs.src().size_hint(), self.combs.n()); - - // Total bounds for self ( length(powerset(set) == 2 ^ length(set) ) - let self_total = size_hint::pow_scalar_base(2, src_total); - - if self.pos < usize::MAX { - // Subtract count of elements already yielded from total. - size_hint::sub_scalar(self_total, self.pos) - } else { - // Fallback: self.pos is saturated and no longer reliable. - (0, self_total.1) + fn nth(&mut self, mut n: usize) -> Option { + loop { + match self.combs.try_nth(n) { + Ok(item) => return Some(item), + Err(steps) => { + if !self.increment_k() { + return None; + } + n -= steps; + } + } } } + + fn size_hint(&self) -> SizeHint { + let k = self.combs.k(); + // Total bounds for source iterator. + let (n_min, n_max) = self.combs.src().size_hint(); + let low = remaining_for(n_min, k).unwrap_or(usize::MAX); + let upp = n_max.and_then(|n| remaining_for(n, k)); + size_hint::add(self.combs.size_hint(), (low, upp)) + } + + fn count(self) -> usize { + let k = self.combs.k(); + let (n, combs_count) = self.combs.n_and_count(); + combs_count + remaining_for(n, k).unwrap() + } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let mut it = self.combs; + if it.k() == 0 { + init = it.by_ref().fold(init, &mut f); + it.reset(1); + } + init = it.by_ref().fold(init, &mut f); + // n is now known for sure because k >= 1 and all k-combinations have been generated. + for k in it.k() + 1..=it.n() { + it.reset(k); + init = it.by_ref().fold(init, &mut f); + } + init + } } impl FusedIterator for Powerset - where - I: Iterator, - I::Item: Clone, -{} +where + I: Iterator, + I::Item: Clone, +{ +} + +fn remaining_for(n: usize, k: usize) -> Option { + (k + 1..=n).try_fold(0usize, |sum, i| sum.checked_add(checked_binomial(n, i)?)) +} diff --git a/third_party/rust/itertools/src/process_results_impl.rs b/third_party/rust/itertools/src/process_results_impl.rs index 44308f37809..31389c5fda8 100644 --- a/third_party/rust/itertools/src/process_results_impl.rs +++ b/third_party/rust/itertools/src/process_results_impl.rs @@ -1,3 +1,5 @@ +#[cfg(doc)] +use crate::Itertools; /// An iterator that produces only the `T` values as long as the /// inner iterator produces `Ok(T)`. @@ -11,13 +13,10 @@ pub struct ProcessResults<'a, I, E: 'a> { iter: I, } -impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E> - where I: Iterator> -{ - type Item = T; - - fn next(&mut self) -> Option { - match self.iter.next() { +impl ProcessResults<'_, I, E> { + #[inline(always)] + fn next_body(&mut self, item: Option>) -> Option { + match item { Some(Ok(x)) => Some(x), Some(Err(e)) => { *self.error = Err(e); @@ -26,6 +25,18 @@ impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E> None => None, } } +} + +impl Iterator for ProcessResults<'_, I, E> +where + I: Iterator>, +{ + type Item = T; + + fn next(&mut self) -> Option { + let item = self.iter.next(); + self.next_body(item) + } fn size_hint(&self) -> (usize, Option) { (0, self.iter.size_hint().1) @@ -49,49 +60,49 @@ impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E> } } +impl DoubleEndedIterator for ProcessResults<'_, I, E> +where + I: Iterator>, + I: DoubleEndedIterator, +{ + fn next_back(&mut self) -> Option { + let item = self.iter.next_back(); + self.next_body(item) + } + + fn rfold(mut self, init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let error = self.error; + self.iter + .try_rfold(init, |acc, opt| match opt { + Ok(x) => Ok(f(acc, x)), + Err(e) => { + *error = Err(e); + Err(acc) + } + }) + .unwrap_or_else(|e| e) + } +} + /// “Lift” a function of the values of an iterator so that it can process /// an iterator of `Result` values instead. /// -/// `iterable` is an iterator or iterable with `Result` elements, where -/// `T` is the value type and `E` the error type. -/// -/// `processor` is a closure that receives an adapted version of the iterable -/// as the only argument — the adapted iterator produces elements of type `T`, -/// as long as the original iterator produces `Ok` values. -/// -/// If the original iterable produces an error at any point, the adapted -/// iterator ends and the `process_results` function will return the -/// error iself. -/// -/// Otherwise, the return value from the closure is returned wrapped -/// inside `Ok`. -/// -/// # Example -/// -/// ``` -/// use itertools::process_results; -/// -/// type R = Result; -/// -/// let first_values: Vec = vec![Ok(1), Ok(0), Ok(3)]; -/// let second_values: Vec = vec![Ok(2), Ok(1), Err("overflow")]; -/// -/// // “Lift” the iterator .max() method to work on the values in Results using process_results -/// -/// let first_max = process_results(first_values, |iter| iter.max().unwrap_or(0)); -/// let second_max = process_results(second_values, |iter| iter.max().unwrap_or(0)); -/// -/// assert_eq!(first_max, Ok(3)); -/// assert!(second_max.is_err()); -/// ``` +/// [`IntoIterator`] enabled version of [`Itertools::process_results`]. pub fn process_results(iterable: I, processor: F) -> Result - where I: IntoIterator>, - F: FnOnce(ProcessResults) -> R +where + I: IntoIterator>, + F: FnOnce(ProcessResults) -> R, { let iter = iterable.into_iter(); let mut error = Ok(()); - let result = processor(ProcessResults { error: &mut error, iter }); + let result = processor(ProcessResults { + error: &mut error, + iter, + }); error.map(|_| result) } diff --git a/third_party/rust/itertools/src/put_back_n_impl.rs b/third_party/rust/itertools/src/put_back_n_impl.rs index 60ea8e64950..a9eb4179c49 100644 --- a/third_party/rust/itertools/src/put_back_n_impl.rs +++ b/third_party/rust/itertools/src/put_back_n_impl.rs @@ -7,6 +7,7 @@ use crate::size_hint; /// /// Iterator element type is `I::Item`. #[derive(Debug, Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct PutBackN { top: Vec, iter: I, @@ -17,7 +18,8 @@ pub struct PutBackN { /// /// Iterator element type is `I::Item`. pub fn put_back_n(iterable: I) -> PutBackN - where I: IntoIterator +where + I: IntoIterator, { PutBackN { top: Vec::new(), @@ -26,7 +28,8 @@ pub fn put_back_n(iterable: I) -> PutBackN } impl PutBackN { - /// Puts x in front of the iterator. + /// Puts `x` in front of the iterator. + /// /// The values are yielded in order of the most recently put back /// values first. /// @@ -57,5 +60,12 @@ impl Iterator for PutBackN { fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.iter.size_hint(), self.top.len()) } -} + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + init = self.top.into_iter().rfold(init, &mut f); + self.iter.fold(init, f) + } +} diff --git a/third_party/rust/itertools/src/rciter_impl.rs b/third_party/rust/itertools/src/rciter_impl.rs index 7298350a881..96a0fd69c5b 100644 --- a/third_party/rust/itertools/src/rciter_impl.rs +++ b/third_party/rust/itertools/src/rciter_impl.rs @@ -1,10 +1,10 @@ - -use std::iter::{FusedIterator, IntoIterator}; use alloc::rc::Rc; use std::cell::RefCell; +use std::iter::{FusedIterator, IntoIterator}; /// A wrapper for `Rc>`, that implements the `Iterator` trait. #[derive(Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct RcIter { /// The boxed iterator. pub rciter: Rc>, @@ -45,9 +45,12 @@ pub struct RcIter { /// `.next()`, i.e. if it somehow participates in an “iterator knot” /// where it is an adaptor of itself. pub fn rciter(iterable: I) -> RcIter - where I: IntoIterator +where + I: IntoIterator, { - RcIter { rciter: Rc::new(RefCell::new(iterable.into_iter())) } + RcIter { + rciter: Rc::new(RefCell::new(iterable.into_iter())), + } } impl Clone for RcIter { @@ -55,7 +58,8 @@ impl Clone for RcIter { } impl Iterator for RcIter - where I: Iterator +where + I: Iterator, { type Item = A; #[inline] @@ -73,7 +77,8 @@ impl Iterator for RcIter } impl DoubleEndedIterator for RcIter - where I: DoubleEndedIterator +where + I: DoubleEndedIterator, { #[inline] fn next_back(&mut self) -> Option { @@ -82,8 +87,9 @@ impl DoubleEndedIterator for RcIter } /// Return an iterator from `&RcIter` (by simply cloning it). -impl<'a, I> IntoIterator for &'a RcIter - where I: Iterator +impl IntoIterator for &RcIter +where + I: Iterator, { type Item = I::Item; type IntoIter = RcIter; @@ -93,7 +99,4 @@ impl<'a, I> IntoIterator for &'a RcIter } } - -impl FusedIterator for RcIter - where I: FusedIterator -{} +impl FusedIterator for RcIter where I: FusedIterator {} diff --git a/third_party/rust/itertools/src/repeatn.rs b/third_party/rust/itertools/src/repeatn.rs index e025f6f6a58..d86ad9facd3 100644 --- a/third_party/rust/itertools/src/repeatn.rs +++ b/third_party/rust/itertools/src/repeatn.rs @@ -6,23 +6,28 @@ use std::iter::FusedIterator; #[must_use = "iterators are lazy and do nothing unless consumed"] #[derive(Clone, Debug)] pub struct RepeatN { - elt: Option, + pub(crate) elt: Option, n: usize, } /// Create an iterator that produces `n` repetitions of `element`. pub fn repeat_n(element: A, n: usize) -> RepeatN - where A: Clone, +where + A: Clone, { if n == 0 { - RepeatN { elt: None, n, } + RepeatN { elt: None, n } } else { - RepeatN { elt: Some(element), n, } + RepeatN { + elt: Some(element), + n, + } } } impl Iterator for RepeatN - where A: Clone +where + A: Clone, { type Item = A; @@ -39,21 +44,40 @@ impl Iterator for RepeatN fn size_hint(&self) -> (usize, Option) { (self.n, Some(self.n)) } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + match self { + Self { elt: Some(elt), n } => { + debug_assert!(n > 0); + init = (1..n).map(|_| elt.clone()).fold(init, &mut f); + f(init, elt) + } + _ => init, + } + } } impl DoubleEndedIterator for RepeatN - where A: Clone +where + A: Clone, { #[inline] fn next_back(&mut self) -> Option { self.next() } + + #[inline] + fn rfold(self, init: B, f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + self.fold(init, f) + } } -impl ExactSizeIterator for RepeatN - where A: Clone -{} +impl ExactSizeIterator for RepeatN where A: Clone {} -impl FusedIterator for RepeatN - where A: Clone -{} +impl FusedIterator for RepeatN where A: Clone {} diff --git a/third_party/rust/itertools/src/size_hint.rs b/third_party/rust/itertools/src/size_hint.rs index 71ea1412b53..6cfead7f2b4 100644 --- a/third_party/rust/itertools/src/size_hint.rs +++ b/third_party/rust/itertools/src/size_hint.rs @@ -1,9 +1,7 @@ //! Arithmetic on `Iterator.size_hint()` values. //! -use std::usize; use std::cmp; -use std::u32; /// `SizeHint` is the return type of `Iterator::size_hint()`. pub type SizeHint = (usize, Option); @@ -31,7 +29,6 @@ pub fn add_scalar(sh: SizeHint, x: usize) -> SizeHint { /// Subtract `x` correctly from a `SizeHint`. #[inline] -#[allow(dead_code)] pub fn sub_scalar(sh: SizeHint, x: usize) -> SizeHint { let (mut low, mut hi) = sh; low = low.saturating_sub(x); @@ -39,22 +36,7 @@ pub fn sub_scalar(sh: SizeHint, x: usize) -> SizeHint { (low, hi) } - /// Multiply `SizeHint` correctly -/// -/// ```ignore -/// use std::usize; -/// use itertools::size_hint; -/// -/// assert_eq!(size_hint::mul((3, Some(4)), (3, Some(4))), -/// (9, Some(16))); -/// -/// assert_eq!(size_hint::mul((3, Some(4)), (usize::MAX, None)), -/// (usize::MAX, None)); -/// -/// assert_eq!(size_hint::mul((3, None), (0, Some(0))), -/// (0, Some(0))); -/// ``` #[inline] pub fn mul(a: SizeHint, b: SizeHint) -> SizeHint { let low = a.0.saturating_mul(b.0); @@ -75,20 +57,6 @@ pub fn mul_scalar(sh: SizeHint, x: usize) -> SizeHint { (low, hi) } -/// Raise `base` correctly by a `SizeHint` exponent. -#[inline] -pub fn pow_scalar_base(base: usize, exp: SizeHint) -> SizeHint { - let exp_low = cmp::min(exp.0, u32::MAX as usize) as u32; - let low = base.saturating_pow(exp_low); - - let hi = exp.1.and_then(|exp| { - let exp_hi = cmp::min(exp, u32::MAX as usize) as u32; - base.checked_pow(exp_hi) - }); - - (low, hi) -} - /// Return the maximum #[inline] pub fn max(a: SizeHint, b: SizeHint) -> SizeHint { @@ -117,3 +85,10 @@ pub fn min(a: SizeHint, b: SizeHint) -> SizeHint { }; (lower, upper) } + +#[test] +fn mul_size_hints() { + assert_eq!(mul((3, Some(4)), (3, Some(4))), (9, Some(16))); + assert_eq!(mul((3, Some(4)), (usize::MAX, None)), (usize::MAX, None)); + assert_eq!(mul((3, None), (0, Some(0))), (0, Some(0))); +} diff --git a/third_party/rust/itertools/src/sources.rs b/third_party/rust/itertools/src/sources.rs index 3877ce3c8b3..c405ffdc719 100644 --- a/third_party/rust/itertools/src/sources.rs +++ b/third_party/rust/itertools/src/sources.rs @@ -5,62 +5,6 @@ use std::fmt; use std::mem; -/// See [`repeat_call`](crate::repeat_call) for more information. -#[derive(Clone)] -#[deprecated(note="Use std repeat_with() instead", since="0.8.0")] -pub struct RepeatCall { - f: F, -} - -impl fmt::Debug for RepeatCall -{ - debug_fmt_fields!(RepeatCall, ); -} - -/// An iterator source that produces elements indefinitely by calling -/// a given closure. -/// -/// Iterator element type is the return type of the closure. -/// -/// ``` -/// use itertools::repeat_call; -/// use itertools::Itertools; -/// use std::collections::BinaryHeap; -/// -/// let mut heap = BinaryHeap::from(vec![2, 5, 3, 7, 8]); -/// -/// // extract each element in sorted order -/// for element in repeat_call(|| heap.pop()).while_some() { -/// print!("{}", element); -/// } -/// -/// itertools::assert_equal( -/// repeat_call(|| 1).take(5), -/// vec![1, 1, 1, 1, 1] -/// ); -/// ``` -#[deprecated(note="Use std repeat_with() instead", since="0.8.0")] -pub fn repeat_call(function: F) -> RepeatCall - where F: FnMut() -> A -{ - RepeatCall { f: function } -} - -impl Iterator for RepeatCall - where F: FnMut() -> A -{ - type Item = A; - - #[inline] - fn next(&mut self) -> Option { - Some((self.f)()) - } - - fn size_hint(&self) -> (usize, Option) { - (usize::max_value(), None) - } -} - /// Creates a new unfold source with the specified closure as the "iterator /// function" and an initial state to eventually pass to the closure /// @@ -97,8 +41,13 @@ impl Iterator for RepeatCall /// vec![1, 1, 2, 3, 5, 8, 13, 21]); /// assert_eq!(fibonacci.last(), Some(2_971_215_073)) /// ``` +#[deprecated( + note = "Use [std::iter::from_fn](https://doc.rust-lang.org/std/iter/fn.from_fn.html) instead", + since = "0.13.0" +)] pub fn unfold(initial_state: St, f: F) -> Unfold - where F: FnMut(&mut St) -> Option +where + F: FnMut(&mut St) -> Option, { Unfold { f, @@ -107,7 +56,8 @@ pub fn unfold(initial_state: St, f: F) -> Unfold } impl fmt::Debug for Unfold - where St: fmt::Debug, +where + St: fmt::Debug, { debug_fmt_fields!(Unfold, state); } @@ -115,6 +65,10 @@ impl fmt::Debug for Unfold /// See [`unfold`](crate::unfold) for more information. #[derive(Clone)] #[must_use = "iterators are lazy and do nothing unless consumed"] +#[deprecated( + note = "Use [std::iter::FromFn](https://doc.rust-lang.org/std/iter/struct.FromFn.html) instead", + since = "0.13.0" +)] pub struct Unfold { f: F, /// Internal state that will be passed to the closure on the next iteration @@ -122,7 +76,8 @@ pub struct Unfold { } impl Iterator for Unfold - where F: FnMut(&mut St) -> Option +where + F: FnMut(&mut St) -> Option, { type Item = A; @@ -144,13 +99,15 @@ pub struct Iterate { } impl fmt::Debug for Iterate - where St: fmt::Debug, +where + St: fmt::Debug, { debug_fmt_fields!(Iterate, state); } impl Iterator for Iterate - where F: FnMut(&St) -> St +where + F: FnMut(&St) -> St, { type Item = St; @@ -162,7 +119,7 @@ impl Iterator for Iterate #[inline] fn size_hint(&self) -> (usize, Option) { - (usize::max_value(), None) + (usize::MAX, None) } } @@ -171,10 +128,23 @@ impl Iterator for Iterate /// ``` /// use itertools::iterate; /// -/// itertools::assert_equal(iterate(1, |&i| i * 3).take(5), vec![1, 3, 9, 27, 81]); +/// itertools::assert_equal(iterate(1, |i| i % 3 + 1).take(5), vec![1, 2, 3, 1, 2]); /// ``` +/// +/// **Panics** if compute the next value does. +/// +/// ```should_panic +/// # use itertools::iterate; +/// let mut it = iterate(25u32, |x| x - 10).take_while(|&x| x > 10); +/// assert_eq!(it.next(), Some(25)); // `Iterate` holds 15. +/// assert_eq!(it.next(), Some(15)); // `Iterate` holds 5. +/// it.next(); // `5 - 10` overflows. +/// ``` +/// +/// You can alternatively use [`core::iter::successors`] as it better describes a finite iterator. pub fn iterate(initial_value: St, f: F) -> Iterate - where F: FnMut(&St) -> St +where + F: FnMut(&St) -> St, { Iterate { state: initial_value, diff --git a/third_party/rust/itertools/src/take_while_inclusive.rs b/third_party/rust/itertools/src/take_while_inclusive.rs new file mode 100644 index 00000000000..420da9847af --- /dev/null +++ b/third_party/rust/itertools/src/take_while_inclusive.rs @@ -0,0 +1,96 @@ +use core::iter::FusedIterator; +use std::fmt; + +/// An iterator adaptor that consumes elements while the given predicate is +/// `true`, including the element for which the predicate first returned +/// `false`. +/// +/// See [`.take_while_inclusive()`](crate::Itertools::take_while_inclusive) +/// for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Clone)] +pub struct TakeWhileInclusive { + iter: I, + predicate: F, + done: bool, +} + +impl TakeWhileInclusive +where + I: Iterator, + F: FnMut(&I::Item) -> bool, +{ + /// Create a new [`TakeWhileInclusive`] from an iterator and a predicate. + pub(crate) fn new(iter: I, predicate: F) -> Self { + Self { + iter, + predicate, + done: false, + } + } +} + +impl fmt::Debug for TakeWhileInclusive +where + I: Iterator + fmt::Debug, +{ + debug_fmt_fields!(TakeWhileInclusive, iter, done); +} + +impl Iterator for TakeWhileInclusive +where + I: Iterator, + F: FnMut(&I::Item) -> bool, +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + if self.done { + None + } else { + self.iter.next().map(|item| { + if !(self.predicate)(&item) { + self.done = true; + } + item + }) + } + } + + fn size_hint(&self) -> (usize, Option) { + if self.done { + (0, Some(0)) + } else { + (0, self.iter.size_hint().1) + } + } + + fn fold(mut self, init: B, mut f: Fold) -> B + where + Fold: FnMut(B, Self::Item) -> B, + { + if self.done { + init + } else { + let predicate = &mut self.predicate; + self.iter + .try_fold(init, |mut acc, item| { + let is_ok = predicate(&item); + acc = f(acc, item); + if is_ok { + Ok(acc) + } else { + Err(acc) + } + }) + .unwrap_or_else(|err| err) + } + } +} + +impl FusedIterator for TakeWhileInclusive +where + I: Iterator, + F: FnMut(&I::Item) -> bool, +{ +} diff --git a/third_party/rust/itertools/src/tee.rs b/third_party/rust/itertools/src/tee.rs index ea4752906f0..0984c5de963 100644 --- a/third_party/rust/itertools/src/tee.rs +++ b/third_party/rust/itertools/src/tee.rs @@ -1,8 +1,8 @@ use super::size_hint; -use std::cell::RefCell; use alloc::collections::VecDeque; use alloc::rc::Rc; +use std::cell::RefCell; /// Common buffer object for the two tee halves #[derive(Debug)] @@ -19,24 +19,37 @@ struct TeeBuffer { #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[derive(Debug)] pub struct Tee - where I: Iterator +where + I: Iterator, { rcbuffer: Rc>>, id: bool, } pub fn new(iter: I) -> (Tee, Tee) - where I: Iterator +where + I: Iterator, { - let buffer = TeeBuffer{backlog: VecDeque::new(), iter, owner: false}; - let t1 = Tee{rcbuffer: Rc::new(RefCell::new(buffer)), id: true}; - let t2 = Tee{rcbuffer: t1.rcbuffer.clone(), id: false}; + let buffer = TeeBuffer { + backlog: VecDeque::new(), + iter, + owner: false, + }; + let t1 = Tee { + rcbuffer: Rc::new(RefCell::new(buffer)), + id: true, + }; + let t2 = Tee { + rcbuffer: t1.rcbuffer.clone(), + id: false, + }; (t1, t2) } impl Iterator for Tee - where I: Iterator, - I::Item: Clone +where + I: Iterator, + I::Item: Clone, { type Item = I::Item; fn next(&mut self) -> Option { @@ -73,6 +86,8 @@ impl Iterator for Tee } impl ExactSizeIterator for Tee - where I: ExactSizeIterator, - I::Item: Clone -{} +where + I: ExactSizeIterator, + I::Item: Clone, +{ +} diff --git a/third_party/rust/itertools/src/tuple_impl.rs b/third_party/rust/itertools/src/tuple_impl.rs index 06b5c13cb34..c0d556fc95b 100644 --- a/third_party/rust/itertools/src/tuple_impl.rs +++ b/third_party/rust/itertools/src/tuple_impl.rs @@ -1,10 +1,10 @@ //! Some iterator that produces tuples +use std::iter::Cycle; use std::iter::Fuse; use std::iter::FusedIterator; -use std::iter::Take; -use std::iter::Cycle; -use std::marker::PhantomData; + +use crate::size_hint; // `HomogeneousTuple` is a public facade for `TupleCollect`, allowing // tuple-related methods to be used by clients in generic contexts, while @@ -12,9 +12,7 @@ use std::marker::PhantomData; // See https://github.com/rust-itertools/itertools/issues/387 /// Implemented for homogeneous tuples of size up to 12. -pub trait HomogeneousTuple - : TupleCollect -{} +pub trait HomogeneousTuple: TupleCollect {} impl HomogeneousTuple for T {} @@ -24,25 +22,25 @@ impl HomogeneousTuple for T {} /// [`Tuples::into_buffer()`]. #[derive(Clone, Debug)] pub struct TupleBuffer - where T: HomogeneousTuple +where + T: HomogeneousTuple, { cur: usize, buf: T::Buffer, } impl TupleBuffer - where T: HomogeneousTuple +where + T: HomogeneousTuple, { fn new(buf: T::Buffer) -> Self { - TupleBuffer { - cur: 0, - buf, - } + Self { cur: 0, buf } } } impl Iterator for TupleBuffer - where T: HomogeneousTuple +where + T: HomogeneousTuple, { type Item = T::Item; @@ -61,18 +59,16 @@ impl Iterator for TupleBuffer let len = if buffer.is_empty() { 0 } else { - buffer.iter() - .position(|x| x.is_none()) - .unwrap_or_else(|| buffer.len()) + buffer + .iter() + .position(|x| x.is_none()) + .unwrap_or(buffer.len()) }; (len, Some(len)) } } -impl ExactSizeIterator for TupleBuffer - where T: HomogeneousTuple -{ -} +impl ExactSizeIterator for TupleBuffer where T: HomogeneousTuple {} /// An iterator that groups the items in tuples of a specific size. /// @@ -80,8 +76,9 @@ impl ExactSizeIterator for TupleBuffer #[derive(Clone, Debug)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Tuples - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { iter: Fuse, buf: T::Buffer, @@ -89,8 +86,9 @@ pub struct Tuples /// Create a new tuples iterator. pub fn tuples(iter: I) -> Tuples - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { Tuples { iter: iter.fuse(), @@ -99,19 +97,50 @@ pub fn tuples(iter: I) -> Tuples } impl Iterator for Tuples - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { type Item = T; fn next(&mut self) -> Option { T::collect_from_iter(&mut self.iter, &mut self.buf) } + + fn size_hint(&self) -> (usize, Option) { + // The number of elts we've drawn from the underlying iterator, but have + // not yet produced as a tuple. + let buffered = T::buffer_len(&self.buf); + // To that, we must add the size estimates of the underlying iterator. + let (unbuffered_lo, unbuffered_hi) = self.iter.size_hint(); + // The total low estimate is the sum of the already-buffered elements, + // plus the low estimate of remaining unbuffered elements, divided by + // the tuple size. + let total_lo = add_then_div(unbuffered_lo, buffered, T::num_items()).unwrap_or(usize::MAX); + // And likewise for the total high estimate, but using the high estimate + // of the remaining unbuffered elements. + let total_hi = unbuffered_hi.and_then(|hi| add_then_div(hi, buffered, T::num_items())); + (total_lo, total_hi) + } +} + +/// `(n + a) / d` avoiding overflow when possible, returns `None` if it overflows. +fn add_then_div(n: usize, a: usize, d: usize) -> Option { + debug_assert_ne!(d, 0); + (n / d).checked_add(a / d)?.checked_add((n % d + a % d) / d) +} + +impl ExactSizeIterator for Tuples +where + I: ExactSizeIterator, + T: HomogeneousTuple, +{ } impl Tuples - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { /// Return a buffer with the produced items that was not enough to be grouped in a tuple. /// @@ -128,7 +157,6 @@ impl Tuples } } - /// An iterator over all contiguous windows that produces tuples of a specific size. /// /// See [`.tuple_windows()`](crate::Itertools::tuple_windows) for more @@ -136,125 +164,167 @@ impl Tuples #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[derive(Clone, Debug)] pub struct TupleWindows - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { iter: I, last: Option, } /// Create a new tuple windows iterator. -pub fn tuple_windows(mut iter: I) -> TupleWindows - where I: Iterator, - T: HomogeneousTuple, - T::Item: Clone +pub fn tuple_windows(iter: I) -> TupleWindows +where + I: Iterator, + T: HomogeneousTuple, + T::Item: Clone, { - use std::iter::once; - - let mut last = None; - if T::num_items() != 1 { - // put in a duplicate item in front of the tuple; this simplifies - // .next() function. - if let Some(item) = iter.next() { - let iter = once(item.clone()).chain(once(item)).chain(&mut iter); - last = T::collect_from_iter_no_buf(iter); - } - } - - TupleWindows { - iter, - last, - } + TupleWindows { last: None, iter } } impl Iterator for TupleWindows - where I: Iterator, - T: HomogeneousTuple + Clone, - T::Item: Clone +where + I: Iterator, + T: HomogeneousTuple + Clone, + T::Item: Clone, { type Item = T; fn next(&mut self) -> Option { if T::num_items() == 1 { - return T::collect_from_iter_no_buf(&mut self.iter) + return T::collect_from_iter_no_buf(&mut self.iter); } - if let Some(ref mut last) = self.last { - if let Some(new) = self.iter.next() { + if let Some(new) = self.iter.next() { + if let Some(ref mut last) = self.last { last.left_shift_push(new); - return Some(last.clone()); + Some(last.clone()) + } else { + use std::iter::once; + let iter = once(new).chain(&mut self.iter); + self.last = T::collect_from_iter_no_buf(iter); + self.last.clone() } + } else { + None } - None + } + + fn size_hint(&self) -> (usize, Option) { + let mut sh = self.iter.size_hint(); + // Adjust the size hint at the beginning + // OR when `num_items == 1` (but it does not change the size hint). + if self.last.is_none() { + sh = size_hint::sub_scalar(sh, T::num_items() - 1); + } + sh } } -impl FusedIterator for TupleWindows - where I: FusedIterator, - T: HomogeneousTuple + Clone, - T::Item: Clone -{} +impl ExactSizeIterator for TupleWindows +where + I: ExactSizeIterator, + T: HomogeneousTuple + Clone, + T::Item: Clone, +{ +} -/// An iterator over all windows,wrapping back to the first elements when the +impl FusedIterator for TupleWindows +where + I: FusedIterator, + T: HomogeneousTuple + Clone, + T::Item: Clone, +{ +} + +/// An iterator over all windows, wrapping back to the first elements when the /// window would otherwise exceed the length of the iterator, producing tuples /// of a specific size. /// /// See [`.circular_tuple_windows()`](crate::Itertools::circular_tuple_windows) for more /// information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct CircularTupleWindows - where I: Iterator + Clone, - T: TupleCollect + Clone +#[derive(Debug, Clone)] +pub struct CircularTupleWindows +where + I: Iterator + Clone, + T: TupleCollect + Clone, { - iter: Take, T>>, - phantom_data: PhantomData + iter: TupleWindows, T>, + len: usize, } pub fn circular_tuple_windows(iter: I) -> CircularTupleWindows - where I: Iterator + Clone + ExactSizeIterator, - T: TupleCollect + Clone, - T::Item: Clone +where + I: Iterator + Clone + ExactSizeIterator, + T: TupleCollect + Clone, + T::Item: Clone, { let len = iter.len(); - let iter = tuple_windows(iter.cycle()).take(len); + let iter = tuple_windows(iter.cycle()); - CircularTupleWindows { - iter, - phantom_data: PhantomData{} - } + CircularTupleWindows { iter, len } } impl Iterator for CircularTupleWindows - where I: Iterator + Clone, - T: TupleCollect + Clone, - T::Item: Clone +where + I: Iterator + Clone, + T: TupleCollect + Clone, + T::Item: Clone, { type Item = T; fn next(&mut self) -> Option { - self.iter.next() + if self.len != 0 { + self.len -= 1; + self.iter.next() + } else { + None + } } + + fn size_hint(&self) -> (usize, Option) { + (self.len, Some(self.len)) + } +} + +impl ExactSizeIterator for CircularTupleWindows +where + I: Iterator + Clone, + T: TupleCollect + Clone, + T::Item: Clone, +{ +} + +impl FusedIterator for CircularTupleWindows +where + I: Iterator + Clone, + T: TupleCollect + Clone, + T::Item: Clone, +{ } pub trait TupleCollect: Sized { type Item; type Buffer: Default + AsRef<[Option]> + AsMut<[Option]>; + fn buffer_len(buf: &Self::Buffer) -> usize { + let s = buf.as_ref(); + s.iter().position(Option::is_none).unwrap_or(s.len()) + } + fn collect_from_iter(iter: I, buf: &mut Self::Buffer) -> Option - where I: IntoIterator; + where + I: IntoIterator; fn collect_from_iter_no_buf(iter: I) -> Option - where I: IntoIterator; + where + I: IntoIterator; fn num_items() -> usize; fn left_shift_push(&mut self, item: Self::Item); } -macro_rules! count_ident{ - () => {0}; - ($i0:ident, $($i:ident,)*) => {1 + count_ident!($($i,)*)}; -} macro_rules! rev_for_each_ident{ ($m:ident, ) => {}; ($m:ident, $i0:ident, $($i:ident,)*) => { @@ -269,7 +339,7 @@ macro_rules! impl_tuple_collect { impl_tuple_collect!($($Y,)*); impl TupleCollect for ($(ignore_ident!($Y, A),)*) { type Item = A; - type Buffer = [Option; count_ident!($($Y,)*) - 1]; + type Buffer = [Option; count_ident!($($Y)*) - 1]; #[allow(unused_assignments, unused_mut)] fn collect_from_iter(iter: I, buf: &mut Self::Buffer) -> Option @@ -312,7 +382,7 @@ macro_rules! impl_tuple_collect { } fn num_items() -> usize { - count_ident!($($Y,)*) + count_ident!($($Y)*) } fn left_shift_push(&mut self, mut item: A) { diff --git a/third_party/rust/itertools/src/unique_impl.rs b/third_party/rust/itertools/src/unique_impl.rs index 4e81e78ec03..0f6397e48fb 100644 --- a/third_party/rust/itertools/src/unique_impl.rs +++ b/third_party/rust/itertools/src/unique_impl.rs @@ -1,7 +1,7 @@ -use std::collections::HashMap; use std::collections::hash_map::Entry; -use std::hash::Hash; +use std::collections::HashMap; use std::fmt; +use std::hash::Hash; use std::iter::FusedIterator; /// An iterator adapter to filter out duplicate elements. @@ -19,17 +19,19 @@ pub struct UniqueBy { } impl fmt::Debug for UniqueBy - where I: Iterator + fmt::Debug, - V: fmt::Debug + Hash + Eq, +where + I: Iterator + fmt::Debug, + V: fmt::Debug + Hash + Eq, { debug_fmt_fields!(UniqueBy, iter, used); } /// Create a new `UniqueBy` iterator. pub fn unique_by(iter: I, f: F) -> UniqueBy - where V: Eq + Hash, - F: FnMut(&I::Item) -> V, - I: Iterator, +where + V: Eq + Hash, + F: FnMut(&I::Item) -> V, + I: Iterator, { UniqueBy { iter, @@ -40,8 +42,9 @@ pub fn unique_by(iter: I, f: F) -> UniqueBy // count the number of new unique keys in iterable (`used` is the set already seen) fn count_new_keys(mut used: HashMap, iterable: I) -> usize - where I: IntoIterator, - K: Hash + Eq, +where + I: IntoIterator, + K: Hash + Eq, { let iter = iterable.into_iter(); let current_used = used.len(); @@ -50,20 +53,16 @@ fn count_new_keys(mut used: HashMap, iterable: I) -> usize } impl Iterator for UniqueBy - where I: Iterator, - V: Eq + Hash, - F: FnMut(&I::Item) -> V +where + I: Iterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V, { type Item = I::Item; fn next(&mut self) -> Option { - while let Some(v) = self.iter.next() { - let key = (self.f)(&v); - if self.used.insert(key, ()).is_none() { - return Some(v); - } - } - None + let Self { iter, used, f } = self; + iter.find(|v| used.insert(f(v), ()).is_none()) } #[inline] @@ -79,42 +78,42 @@ impl Iterator for UniqueBy } impl DoubleEndedIterator for UniqueBy - where I: DoubleEndedIterator, - V: Eq + Hash, - F: FnMut(&I::Item) -> V +where + I: DoubleEndedIterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V, { fn next_back(&mut self) -> Option { - while let Some(v) = self.iter.next_back() { - let key = (self.f)(&v); - if self.used.insert(key, ()).is_none() { - return Some(v); - } - } - None + let Self { iter, used, f } = self; + iter.rfind(|v| used.insert(f(v), ()).is_none()) } } impl FusedIterator for UniqueBy - where I: FusedIterator, - V: Eq + Hash, - F: FnMut(&I::Item) -> V -{} +where + I: FusedIterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V, +{ +} impl Iterator for Unique - where I: Iterator, - I::Item: Eq + Hash + Clone +where + I: Iterator, + I::Item: Eq + Hash + Clone, { type Item = I::Item; fn next(&mut self) -> Option { - while let Some(v) = self.iter.iter.next() { - if let Entry::Vacant(entry) = self.iter.used.entry(v) { + let UniqueBy { iter, used, .. } = &mut self.iter; + iter.find_map(|v| { + if let Entry::Vacant(entry) = used.entry(v) { let elt = entry.key().clone(); entry.insert(()); return Some(elt); } - } - None + None + }) } #[inline] @@ -129,51 +128,61 @@ impl Iterator for Unique } impl DoubleEndedIterator for Unique - where I: DoubleEndedIterator, - I::Item: Eq + Hash + Clone +where + I: DoubleEndedIterator, + I::Item: Eq + Hash + Clone, { fn next_back(&mut self) -> Option { - while let Some(v) = self.iter.iter.next_back() { - if let Entry::Vacant(entry) = self.iter.used.entry(v) { + let UniqueBy { iter, used, .. } = &mut self.iter; + iter.rev().find_map(|v| { + if let Entry::Vacant(entry) = used.entry(v) { let elt = entry.key().clone(); entry.insert(()); return Some(elt); } - } - None + None + }) } } impl FusedIterator for Unique - where I: FusedIterator, - I::Item: Eq + Hash + Clone -{} +where + I: FusedIterator, + I::Item: Eq + Hash + Clone, +{ +} /// An iterator adapter to filter out duplicate elements. /// /// See [`.unique()`](crate::Itertools::unique) for more information. #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Unique { +pub struct Unique +where + I: Iterator, + I::Item: Eq + Hash + Clone, +{ iter: UniqueBy, } impl fmt::Debug for Unique - where I: Iterator + fmt::Debug, - I::Item: Hash + Eq + fmt::Debug, +where + I: Iterator + fmt::Debug, + I::Item: Hash + Eq + fmt::Debug + Clone, { debug_fmt_fields!(Unique, iter); } pub fn unique(iter: I) -> Unique - where I: Iterator, - I::Item: Eq + Hash, +where + I: Iterator, + I::Item: Eq + Hash + Clone, { Unique { iter: UniqueBy { iter, used: HashMap::new(), f: (), - } + }, } } diff --git a/third_party/rust/itertools/src/unziptuple.rs b/third_party/rust/itertools/src/unziptuple.rs index 7af29ec4abd..2c79c2d842c 100644 --- a/third_party/rust/itertools/src/unziptuple.rs +++ b/third_party/rust/itertools/src/unziptuple.rs @@ -1,6 +1,6 @@ /// Converts an iterator of tuples into a tuple of containers. /// -/// `unzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each +/// `multiunzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each /// column. /// /// This function is, in some sense, the opposite of [`multizip`]. diff --git a/third_party/rust/itertools/src/with_position.rs b/third_party/rust/itertools/src/with_position.rs index 1388503d1cd..2d56bb9b224 100644 --- a/third_party/rust/itertools/src/with_position.rs +++ b/third_party/rust/itertools/src/with_position.rs @@ -1,28 +1,40 @@ -use std::iter::{Fuse,Peekable, FusedIterator}; +use std::fmt; +use std::iter::{Fuse, FusedIterator, Peekable}; /// An iterator adaptor that wraps each element in an [`Position`]. /// -/// Iterator element type is `Position`. +/// Iterator element type is `(Position, I::Item)`. /// /// See [`.with_position()`](crate::Itertools::with_position) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct WithPosition - where I: Iterator, +where + I: Iterator, { handled_first: bool, peekable: Peekable>, } +impl fmt::Debug for WithPosition +where + I: Iterator, + Peekable>: fmt::Debug, +{ + debug_fmt_fields!(WithPosition, handled_first, peekable); +} + impl Clone for WithPosition - where I: Clone + Iterator, - I::Item: Clone, +where + I: Clone + Iterator, + I::Item: Clone, { clone_fields!(handled_first, peekable); } /// Create a new `WithPosition` iterator. pub fn with_position(iter: I) -> WithPosition - where I: Iterator, +where + I: Iterator, { WithPosition { handled_first: false, @@ -30,36 +42,24 @@ pub fn with_position(iter: I) -> WithPosition } } -/// A value yielded by `WithPosition`. +/// The first component of the value yielded by `WithPosition`. /// Indicates the position of this element in the iterator results. /// /// See [`.with_position()`](crate::Itertools::with_position) for more information. -#[derive(Copy, Clone, Debug, PartialEq)] -pub enum Position { +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum Position { /// This is the first element. - First(T), + First, /// This is neither the first nor the last element. - Middle(T), + Middle, /// This is the last element. - Last(T), + Last, /// This is the only element. - Only(T), -} - -impl Position { - /// Return the inner value. - pub fn into_inner(self) -> T { - match self { - Position::First(x) | - Position::Middle(x) | - Position::Last(x) | - Position::Only(x) => x, - } - } + Only, } impl Iterator for WithPosition { - type Item = Position; + type Item = (Position, I::Item); fn next(&mut self) -> Option { match self.peekable.next() { @@ -70,15 +70,15 @@ impl Iterator for WithPosition { // Peek to see if this is also the last item, // in which case tag it as `Only`. match self.peekable.peek() { - Some(_) => Some(Position::First(item)), - None => Some(Position::Only(item)), + Some(_) => Some((Position::First, item)), + None => Some((Position::Only, item)), } } else { // Have seen the first item, and there's something left. // Peek to see if this is the last item. match self.peekable.peek() { - Some(_) => Some(Position::Middle(item)), - None => Some(Position::Last(item)), + Some(_) => Some((Position::Middle, item)), + None => Some((Position::Last, item)), } } } @@ -90,11 +90,35 @@ impl Iterator for WithPosition { fn size_hint(&self) -> (usize, Option) { self.peekable.size_hint() } + + fn fold(mut self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + if let Some(mut head) = self.peekable.next() { + if !self.handled_first { + // The current head is `First` or `Only`, + // it depends if there is another item or not. + match self.peekable.next() { + Some(second) => { + let first = std::mem::replace(&mut head, second); + init = f(init, (Position::First, first)); + } + None => return f(init, (Position::Only, head)), + } + } + // Have seen the first item, and there's something left. + init = self.peekable.fold(init, |acc, mut item| { + std::mem::swap(&mut head, &mut item); + f(acc, (Position::Middle, item)) + }); + // The "head" is now the last item. + init = f(init, (Position::Last, head)); + } + init + } } -impl ExactSizeIterator for WithPosition - where I: ExactSizeIterator, -{ } +impl ExactSizeIterator for WithPosition where I: ExactSizeIterator {} -impl FusedIterator for WithPosition -{} +impl FusedIterator for WithPosition {} diff --git a/third_party/rust/itertools/src/zip_eq_impl.rs b/third_party/rust/itertools/src/zip_eq_impl.rs index a079b326a4c..3240a40eb3c 100644 --- a/third_party/rust/itertools/src/zip_eq_impl.rs +++ b/third_party/rust/itertools/src/zip_eq_impl.rs @@ -1,6 +1,7 @@ use super::size_hint; /// An iterator which iterates two other iterators simultaneously +/// and panic if they have different lengths. /// /// See [`.zip_eq()`](crate::Itertools::zip_eq) for more information. #[derive(Clone, Debug)] @@ -10,9 +11,7 @@ pub struct ZipEq { b: J, } -/// Iterate `i` and `j` in lock step. -/// -/// **Panics** if the iterators are not of the same length. +/// Zips two iterators but **panics** if they are not of the same length. /// /// [`IntoIterator`] enabled version of [`Itertools::zip_eq`](crate::Itertools::zip_eq). /// @@ -22,11 +21,13 @@ pub struct ZipEq { /// let data = [1, 2, 3, 4, 5]; /// for (a, b) in zip_eq(&data[..data.len() - 1], &data[1..]) { /// /* loop body */ +/// # let _ = (a, b); /// } /// ``` pub fn zip_eq(i: I, j: J) -> ZipEq - where I: IntoIterator, - J: IntoIterator +where + I: IntoIterator, + J: IntoIterator, { ZipEq { a: i.into_iter(), @@ -35,8 +36,9 @@ pub fn zip_eq(i: I, j: J) -> ZipEq } impl Iterator for ZipEq - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { type Item = (I::Item, J::Item); @@ -44,8 +46,9 @@ impl Iterator for ZipEq match (self.a.next(), self.b.next()) { (None, None) => None, (Some(a), Some(b)) => Some((a, b)), - (None, Some(_)) | (Some(_), None) => - panic!("itertools: .zip_eq() reached end of one iterator before the other") + (None, Some(_)) | (Some(_), None) => { + panic!("itertools: .zip_eq() reached end of one iterator before the other") + } } } @@ -55,6 +58,8 @@ impl Iterator for ZipEq } impl ExactSizeIterator for ZipEq - where I: ExactSizeIterator, - J: ExactSizeIterator -{} +where + I: ExactSizeIterator, + J: ExactSizeIterator, +{ +} diff --git a/third_party/rust/itertools/src/zip_longest.rs b/third_party/rust/itertools/src/zip_longest.rs index cb9a7bacb25..d4eb9a882e3 100644 --- a/third_party/rust/itertools/src/zip_longest.rs +++ b/third_party/rust/itertools/src/zip_longest.rs @@ -1,5 +1,5 @@ -use std::cmp::Ordering::{Equal, Greater, Less}; use super::size_hint; +use std::cmp::Ordering::{Equal, Greater, Less}; use std::iter::{Fuse, FusedIterator}; use crate::either_or_both::EitherOrBoth; @@ -8,6 +8,7 @@ use crate::either_or_both::EitherOrBoth; // and dedicated to itertools https://github.com/rust-lang/rust/pull/19283 /// An iterator which iterates two other iterators simultaneously +/// and wraps the elements in [`EitherOrBoth`]. /// /// This iterator is *fused*. /// @@ -21,8 +22,9 @@ pub struct ZipLongest { /// Create a new `ZipLongest` iterator. pub fn zip_longest(a: T, b: U) -> ZipLongest - where T: Iterator, - U: Iterator +where + T: Iterator, + U: Iterator, { ZipLongest { a: a.fuse(), @@ -31,8 +33,9 @@ pub fn zip_longest(a: T, b: U) -> ZipLongest } impl Iterator for ZipLongest - where T: Iterator, - U: Iterator +where + T: Iterator, + U: Iterator, { type Item = EitherOrBoth; @@ -50,11 +53,29 @@ impl Iterator for ZipLongest fn size_hint(&self) -> (usize, Option) { size_hint::max(self.a.size_hint(), self.b.size_hint()) } + + #[inline] + fn fold(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + let Self { mut a, mut b } = self; + let res = a.try_fold(init, |init, a| match b.next() { + Some(b) => Ok(f(init, EitherOrBoth::Both(a, b))), + None => Err(f(init, EitherOrBoth::Left(a))), + }); + match res { + Ok(acc) => b.map(EitherOrBoth::Right).fold(acc, f), + Err(acc) => a.map(EitherOrBoth::Left).fold(acc, f), + } + } } impl DoubleEndedIterator for ZipLongest - where T: DoubleEndedIterator + ExactSizeIterator, - U: DoubleEndedIterator + ExactSizeIterator +where + T: DoubleEndedIterator + ExactSizeIterator, + U: DoubleEndedIterator + ExactSizeIterator, { #[inline] fn next_back(&mut self) -> Option { @@ -70,14 +91,49 @@ impl DoubleEndedIterator for ZipLongest Less => self.b.next_back().map(EitherOrBoth::Right), } } + + fn rfold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let Self { mut a, mut b } = self; + let a_len = a.len(); + let b_len = b.len(); + match a_len.cmp(&b_len) { + Equal => {} + Greater => { + init = a + .by_ref() + .rev() + .take(a_len - b_len) + .map(EitherOrBoth::Left) + .fold(init, &mut f) + } + Less => { + init = b + .by_ref() + .rev() + .take(b_len - a_len) + .map(EitherOrBoth::Right) + .fold(init, &mut f) + } + } + a.rfold(init, |acc, item_a| { + f(acc, EitherOrBoth::Both(item_a, b.next_back().unwrap())) + }) + } } impl ExactSizeIterator for ZipLongest - where T: ExactSizeIterator, - U: ExactSizeIterator -{} +where + T: ExactSizeIterator, + U: ExactSizeIterator, +{ +} impl FusedIterator for ZipLongest - where T: Iterator, - U: Iterator -{} +where + T: Iterator, + U: Iterator, +{ +} diff --git a/third_party/rust/itertools/src/ziptuple.rs b/third_party/rust/itertools/src/ziptuple.rs index 6d3a584c49c..3ada0296caa 100644 --- a/third_party/rust/itertools/src/ziptuple.rs +++ b/third_party/rust/itertools/src/ziptuple.rs @@ -7,7 +7,7 @@ pub struct Zip { t: T, } -/// An iterator that generalizes *.zip()* and allows running multiple iterators in lockstep. +/// An iterator that generalizes `.zip()` and allows running multiple iterators in lockstep. /// /// The iterator `Zip<(I, J, ..., M)>` is formed from a tuple of iterators (or values that /// implement [`IntoIterator`]) and yields elements @@ -16,11 +16,11 @@ pub struct Zip { /// The iterator element type is a tuple like like `(A, B, ..., E)` where `A` to `E` are the /// element types of the subiterator. /// -/// **Note:** The result of this macro is a value of a named type (`Zip<(I, J, +/// **Note:** The result of this function is a value of a named type (`Zip<(I, J, /// ..)>` of each component iterator `I, J, ...`) if each component iterator is /// nameable. /// -/// Prefer [`izip!()`] over `multizip` for the performance benefits of using the +/// Prefer [`izip!()`](crate::izip) over `multizip` for the performance benefits of using the /// standard library `.zip()`. Prefer `multizip` if a nameable type is needed. /// /// ``` @@ -36,10 +36,9 @@ pub struct Zip { /// /// assert_eq!(results, [0 + 3, 10 + 7, 29, 36]); /// ``` -/// [`izip!()`]: crate::izip pub fn multizip(t: U) -> Zip - where Zip: From, - Zip: Iterator, +where + Zip: From + Iterator, { Zip::from(t) } @@ -82,7 +81,7 @@ macro_rules! impl_zip_iter { fn size_hint(&self) -> (usize, Option) { - let sh = (::std::usize::MAX, None); + let sh = (usize::MAX, None); let ($(ref $B,)*) = self.t; $( let sh = size_hint::min($B.size_hint(), sh); diff --git a/third_party/rust/itertools/tests/adaptors_no_collect.rs b/third_party/rust/itertools/tests/adaptors_no_collect.rs index 103db23f1eb..977224af29f 100644 --- a/third_party/rust/itertools/tests/adaptors_no_collect.rs +++ b/third_party/rust/itertools/tests/adaptors_no_collect.rs @@ -22,9 +22,14 @@ impl Iterator for PanickingCounter { } fn no_collect_test(to_adaptor: T) - where A: Iterator, T: Fn(PanickingCounter) -> A +where + A: Iterator, + T: Fn(PanickingCounter) -> A, { - let counter = PanickingCounter { curr: 0, max: 10_000 }; + let counter = PanickingCounter { + curr: 0, + max: 10_000, + }; let adaptor = to_adaptor(counter); for _ in adaptor.take(5) {} @@ -43,4 +48,4 @@ fn combinations_no_collect() { #[test] fn combinations_with_replacement_no_collect() { no_collect_test(|iter| iter.combinations_with_replacement(5)) -} \ No newline at end of file +} diff --git a/third_party/rust/itertools/tests/laziness.rs b/third_party/rust/itertools/tests/laziness.rs new file mode 100644 index 00000000000..c559d33adc5 --- /dev/null +++ b/third_party/rust/itertools/tests/laziness.rs @@ -0,0 +1,283 @@ +#![allow(unstable_name_collisions)] + +use itertools::Itertools; + +#[derive(Debug, Clone)] +#[must_use = "iterators are lazy and do nothing unless consumed"] +struct Panicking; + +impl Iterator for Panicking { + type Item = u8; + + fn next(&mut self) -> Option { + panic!("iterator adaptor is not lazy") + } + + fn size_hint(&self) -> (usize, Option) { + (0, Some(0)) + } +} + +impl ExactSizeIterator for Panicking {} + +/// ## Usage example +/// ```compile_fail +/// must_use_tests! { +/// name { +/// Panicking.name(); // Add `let _ =` only if required (encountered error). +/// } +/// // ... +/// } +/// ``` +/// +/// **TODO:** test missing `must_use` attributes better, maybe with a new lint. +macro_rules! must_use_tests { + ($($(#[$attr:meta])* $name:ident $body:block)*) => { + $( + /// `#[deny(unused_must_use)]` should force us to ignore the resulting iterators + /// by adding `let _ = ...;` on every iterator. + /// If it does not, then a `must_use` attribute is missing on the associated struct. + /// + /// However, it's only helpful if we don't add `let _ =` before seeing if there is an error or not. + /// And it does not protect us against removed `must_use` attributes. + /// There is no simple way to test this yet. + #[deny(unused_must_use)] + #[test] + $(#[$attr])* + fn $name() $body + )* + }; +} + +must_use_tests! { + // Itertools trait: + interleave { + let _ = Panicking.interleave(Panicking); + } + interleave_shortest { + let _ = Panicking.interleave_shortest(Panicking); + } + intersperse { + let _ = Panicking.intersperse(0); + } + intersperse_with { + let _ = Panicking.intersperse_with(|| 0); + } + get { + let _ = Panicking.get(1..4); + let _ = Panicking.get(1..=4); + let _ = Panicking.get(1..); + let _ = Panicking.get(..4); + let _ = Panicking.get(..=4); + let _ = Panicking.get(..); + } + zip_longest { + let _ = Panicking.zip_longest(Panicking); + } + zip_eq { + let _ = Panicking.zip_eq(Panicking); + } + batching { + let _ = Panicking.batching(Iterator::next); + } + chunk_by { + // ChunkBy + let _ = Panicking.chunk_by(|x| *x); + // Groups + let _ = Panicking.chunk_by(|x| *x).into_iter(); + } + chunks { + // IntoChunks + let _ = Panicking.chunks(1); + let _ = Panicking.chunks(2); + // Chunks + let _ = Panicking.chunks(1).into_iter(); + let _ = Panicking.chunks(2).into_iter(); + } + tuple_windows { + let _ = Panicking.tuple_windows::<(_,)>(); + let _ = Panicking.tuple_windows::<(_, _)>(); + let _ = Panicking.tuple_windows::<(_, _, _)>(); + } + circular_tuple_windows { + let _ = Panicking.circular_tuple_windows::<(_,)>(); + let _ = Panicking.circular_tuple_windows::<(_, _)>(); + let _ = Panicking.circular_tuple_windows::<(_, _, _)>(); + } + tuples { + let _ = Panicking.tuples::<(_,)>(); + let _ = Panicking.tuples::<(_, _)>(); + let _ = Panicking.tuples::<(_, _, _)>(); + } + tee { + let _ = Panicking.tee(); + } + map_into { + let _ = Panicking.map_into::(); + } + map_ok { + let _ = Panicking.map(Ok::).map_ok(|x| x + 1); + } + filter_ok { + let _ = Panicking.map(Ok::).filter_ok(|x| x % 2 == 0); + } + filter_map_ok { + let _ = Panicking.map(Ok::).filter_map_ok(|x| { + if x % 2 == 0 { + Some(x + 1) + } else { + None + } + }); + } + flatten_ok { + let _ = Panicking.map(|x| Ok::<_, ()>([x])).flatten_ok(); + } + merge { + let _ = Panicking.merge(Panicking); + } + merge_by { + let _ = Panicking.merge_by(Panicking, |_, _| true); + } + merge_join_by { + let _ = Panicking.merge_join_by(Panicking, |_, _| true); + let _ = Panicking.merge_join_by(Panicking, Ord::cmp); + } + #[should_panic] + kmerge { + let _ = Panicking.map(|_| Panicking).kmerge(); + } + #[should_panic] + kmerge_by { + let _ = Panicking.map(|_| Panicking).kmerge_by(|_, _| true); + } + cartesian_product { + let _ = Panicking.cartesian_product(Panicking); + } + multi_cartesian_product { + let _ = vec![Panicking, Panicking, Panicking].into_iter().multi_cartesian_product(); + } + coalesce { + let _ = Panicking.coalesce(|x, y| if x == y { Ok(x) } else { Err((x, y)) }); + } + dedup { + let _ = Panicking.dedup(); + } + dedup_by { + let _ = Panicking.dedup_by(|_, _| true); + } + dedup_with_count { + let _ = Panicking.dedup_with_count(); + } + dedup_by_with_count { + let _ = Panicking.dedup_by_with_count(|_, _| true); + } + duplicates { + let _ = Panicking.duplicates(); + } + duplicates_by { + let _ = Panicking.duplicates_by(|x| *x); + } + unique { + let _ = Panicking.unique(); + } + unique_by { + let _ = Panicking.unique_by(|x| *x); + } + peeking_take_while { + let _ = Panicking.peekable().peeking_take_while(|x| x % 2 == 0); + } + take_while_ref { + let _ = Panicking.take_while_ref(|x| x % 2 == 0); + } + take_while_inclusive { + let _ = Panicking.take_while_inclusive(|x| x % 2 == 0); + } + while_some { + let _ = Panicking.map(Some).while_some(); + } + tuple_combinations1 { + let _ = Panicking.tuple_combinations::<(_,)>(); + } + #[should_panic] + tuple_combinations2 { + let _ = Panicking.tuple_combinations::<(_, _)>(); + } + #[should_panic] + tuple_combinations3 { + let _ = Panicking.tuple_combinations::<(_, _, _)>(); + } + combinations { + let _ = Panicking.combinations(0); + let _ = Panicking.combinations(1); + let _ = Panicking.combinations(2); + } + combinations_with_replacement { + let _ = Panicking.combinations_with_replacement(0); + let _ = Panicking.combinations_with_replacement(1); + let _ = Panicking.combinations_with_replacement(2); + } + permutations { + let _ = Panicking.permutations(0); + let _ = Panicking.permutations(1); + let _ = Panicking.permutations(2); + } + powerset { + let _ = Panicking.powerset(); + } + pad_using { + let _ = Panicking.pad_using(25, |_| 10); + } + with_position { + let _ = Panicking.with_position(); + } + positions { + let _ = Panicking.positions(|v| v % 2 == 0); + } + update { + let _ = Panicking.update(|n| *n += 1); + } + multipeek { + let _ = Panicking.multipeek(); + } + // Not iterator themselves but still lazy. + into_grouping_map { + let _ = Panicking.map(|x| (x, x + 1)).into_grouping_map(); + } + into_grouping_map_by { + let _ = Panicking.into_grouping_map_by(|x| *x); + } + // Macros: + iproduct { + let _ = itertools::iproduct!(Panicking); + let _ = itertools::iproduct!(Panicking, Panicking); + let _ = itertools::iproduct!(Panicking, Panicking, Panicking); + } + izip { + let _ = itertools::izip!(Panicking); + let _ = itertools::izip!(Panicking, Panicking); + let _ = itertools::izip!(Panicking, Panicking, Panicking); + } + chain { + let _ = itertools::chain!(Panicking); + let _ = itertools::chain!(Panicking, Panicking); + let _ = itertools::chain!(Panicking, Panicking, Panicking); + } + // Free functions: + multizip { + let _ = itertools::multizip((Panicking, Panicking)); + } + put_back { + let _ = itertools::put_back(Panicking); + let _ = itertools::put_back(Panicking).with_value(15); + } + peek_nth { + let _ = itertools::peek_nth(Panicking); + } + put_back_n { + let _ = itertools::put_back_n(Panicking); + } + rciter { + let _ = itertools::rciter(Panicking); + } +} diff --git a/third_party/rust/itertools/tests/macros_hygiene.rs b/third_party/rust/itertools/tests/macros_hygiene.rs index d1111245d69..e6e89555562 100644 --- a/third_party/rust/itertools/tests/macros_hygiene.rs +++ b/third_party/rust/itertools/tests/macros_hygiene.rs @@ -1,5 +1,11 @@ +mod alloc {} +mod core {} +mod either {} +mod std {} + #[test] fn iproduct_hygiene() { + let _ = itertools::iproduct!(); let _ = itertools::iproduct!(0..6); let _ = itertools::iproduct!(0..6, 0..9); let _ = itertools::iproduct!(0..6, 0..9, 0..12); @@ -11,3 +17,11 @@ fn izip_hygiene() { let _ = itertools::izip!(0..6, 0..9); let _ = itertools::izip!(0..6, 0..9, 0..12); } + +#[test] +fn chain_hygiene() { + let _: ::std::iter::Empty = itertools::chain!(); + let _ = itertools::chain!(0..6); + let _ = itertools::chain!(0..6, 0..9); + let _ = itertools::chain!(0..6, 0..9, 0..12); +} diff --git a/third_party/rust/itertools/tests/merge_join.rs b/third_party/rust/itertools/tests/merge_join.rs index 3280b7d4ecb..776252fc58d 100644 --- a/third_party/rust/itertools/tests/merge_join.rs +++ b/third_party/rust/itertools/tests/merge_join.rs @@ -1,108 +1,101 @@ -use itertools::EitherOrBoth; use itertools::free::merge_join_by; +use itertools::EitherOrBoth; #[test] fn empty() { let left: Vec = vec![]; let right: Vec = vec![]; - let expected_result: Vec> = vec![]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let expected_result: Vec> = vec![]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn left_only() { - let left: Vec = vec![1,2,3]; + let left: Vec = vec![1, 2, 3]; let right: Vec = vec![]; - let expected_result: Vec> = vec![ + let expected_result: Vec> = vec![ EitherOrBoth::Left(1), EitherOrBoth::Left(2), - EitherOrBoth::Left(3) + EitherOrBoth::Left(3), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn right_only() { let left: Vec = vec![]; - let right: Vec = vec![1,2,3]; - let expected_result: Vec> = vec![ + let right: Vec = vec![1, 2, 3]; + let expected_result: Vec> = vec![ EitherOrBoth::Right(1), EitherOrBoth::Right(2), - EitherOrBoth::Right(3) + EitherOrBoth::Right(3), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn first_left_then_right() { - let left: Vec = vec![1,2,3]; - let right: Vec = vec![4,5,6]; - let expected_result: Vec> = vec![ + let left: Vec = vec![1, 2, 3]; + let right: Vec = vec![4, 5, 6]; + let expected_result: Vec> = vec![ EitherOrBoth::Left(1), EitherOrBoth::Left(2), EitherOrBoth::Left(3), EitherOrBoth::Right(4), EitherOrBoth::Right(5), - EitherOrBoth::Right(6) + EitherOrBoth::Right(6), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn first_right_then_left() { - let left: Vec = vec![4,5,6]; - let right: Vec = vec![1,2,3]; - let expected_result: Vec> = vec![ + let left: Vec = vec![4, 5, 6]; + let right: Vec = vec![1, 2, 3]; + let expected_result: Vec> = vec![ EitherOrBoth::Right(1), EitherOrBoth::Right(2), EitherOrBoth::Right(3), EitherOrBoth::Left(4), EitherOrBoth::Left(5), - EitherOrBoth::Left(6) + EitherOrBoth::Left(6), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn interspersed_left_and_right() { - let left: Vec = vec![1,3,5]; - let right: Vec = vec![2,4,6]; - let expected_result: Vec> = vec![ + let left: Vec = vec![1, 3, 5]; + let right: Vec = vec![2, 4, 6]; + let expected_result: Vec> = vec![ EitherOrBoth::Left(1), EitherOrBoth::Right(2), EitherOrBoth::Left(3), EitherOrBoth::Right(4), EitherOrBoth::Left(5), - EitherOrBoth::Right(6) + EitherOrBoth::Right(6), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn overlapping_left_and_right() { - let left: Vec = vec![1,3,4,6]; - let right: Vec = vec![2,3,4,5]; - let expected_result: Vec> = vec![ + let left: Vec = vec![1, 3, 4, 6]; + let right: Vec = vec![2, 3, 4, 5]; + let expected_result: Vec> = vec![ EitherOrBoth::Left(1), EitherOrBoth::Right(2), EitherOrBoth::Both(3, 3), EitherOrBoth::Both(4, 4), EitherOrBoth::Right(5), - EitherOrBoth::Left(6) + EitherOrBoth::Left(6), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } diff --git a/third_party/rust/itertools/tests/peeking_take_while.rs b/third_party/rust/itertools/tests/peeking_take_while.rs index a1147027e82..5be97271dd8 100644 --- a/third_party/rust/itertools/tests/peeking_take_while.rs +++ b/third_party/rust/itertools/tests/peeking_take_while.rs @@ -48,3 +48,22 @@ fn peeking_take_while_slice_iter_rev() { r.peeking_take_while(|_| true).count(); assert_eq!(r.next(), None); } + +#[test] +fn peeking_take_while_nested() { + let mut xs = (0..10).peekable(); + let ys: Vec<_> = xs + .peeking_take_while(|x| *x < 6) + .peeking_take_while(|x| *x != 3) + .collect(); + assert_eq!(ys, vec![0, 1, 2]); + assert_eq!(xs.next(), Some(3)); + + let mut xs = (4..10).peekable(); + let ys: Vec<_> = xs + .peeking_take_while(|x| *x != 3) + .peeking_take_while(|x| *x < 6) + .collect(); + assert_eq!(ys, vec![4, 5]); + assert_eq!(xs.next(), Some(6)); +} diff --git a/third_party/rust/itertools/tests/quick.rs b/third_party/rust/itertools/tests/quick.rs index 0adcf1ad72c..672901e7c70 100644 --- a/third_party/rust/itertools/tests/quick.rs +++ b/third_party/rust/itertools/tests/quick.rs @@ -2,35 +2,28 @@ //! and adaptors. //! //! In particular we test the tedious size_hint and exact size correctness. +//! +//! **NOTE:** Due to performance limitations, these tests are not run with miri! +//! They cannot be relied upon to discover soundness issues. +#![cfg(not(miri))] +#![allow(deprecated, unstable_name_collisions)] + +use itertools::free::{ + cloned, enumerate, multipeek, peek_nth, put_back, put_back_n, rciter, zip, zip_eq, +}; +use itertools::Itertools; +use itertools::{iproduct, izip, multizip, EitherOrBoth}; use quickcheck as qc; +use std::cmp::{max, min, Ordering}; +use std::collections::{HashMap, HashSet}; use std::default::Default; use std::num::Wrapping; use std::ops::Range; -use std::cmp::{max, min, Ordering}; -use std::collections::{HashMap, HashSet}; -use itertools::Itertools; -use itertools::{ - multizip, - EitherOrBoth, - iproduct, - izip, -}; -use itertools::free::{ - cloned, - enumerate, - multipeek, - peek_nth, - put_back, - put_back_n, - rciter, - zip, - zip_eq, -}; -use rand::Rng; -use rand::seq::SliceRandom; use quickcheck::TestResult; +use rand::seq::SliceRandom; +use rand::Rng; /// Trait for size hint modifier types trait HintKind: Copy + Send + qc::Arbitrary { @@ -49,7 +42,7 @@ impl HintKind for Exact { impl qc::Arbitrary for Exact { fn arbitrary(_: &mut G) -> Self { - Exact {} + Self {} } } @@ -66,8 +59,10 @@ struct Inexact { impl HintKind for Inexact { fn loosen_bounds(&self, org_hint: (usize, Option)) -> (usize, Option) { let (org_lower, org_upper) = org_hint; - (org_lower.saturating_sub(self.underestimate), - org_upper.and_then(move |x| x.checked_add(self.overestimate))) + ( + org_lower.saturating_sub(self.underestimate), + org_upper.and_then(move |x| x.checked_add(self.overestimate)), + ) } } @@ -76,27 +71,23 @@ impl qc::Arbitrary for Inexact { let ue_value = usize::arbitrary(g); let oe_value = usize::arbitrary(g); // Compensate for quickcheck using extreme values too rarely - let ue_choices = &[0, ue_value, usize::max_value()]; - let oe_choices = &[0, oe_value, usize::max_value()]; - Inexact { + let ue_choices = &[0, ue_value, usize::MAX]; + let oe_choices = &[0, oe_value, usize::MAX]; + Self { underestimate: *ue_choices.choose(g).unwrap(), overestimate: *oe_choices.choose(g).unwrap(), } } - fn shrink(&self) -> Box> { + fn shrink(&self) -> Box> { let underestimate_value = self.underestimate; let overestimate_value = self.overestimate; - Box::new( - underestimate_value.shrink().flat_map(move |ue_value| - overestimate_value.shrink().map(move |oe_value| - Inexact { - underestimate: ue_value, - overestimate: oe_value, - } - ) - ) - ) + Box::new(underestimate_value.shrink().flat_map(move |ue_value| { + overestimate_value.shrink().map(move |oe_value| Self { + underestimate: ue_value, + overestimate: oe_value, + }) + })) } } @@ -116,10 +107,12 @@ struct Iter { hint_kind: SK, } -impl Iter where HK: HintKind +impl Iter +where + HK: HintKind, { fn new(it: Range, hint_kind: HK) -> Self { - Iter { + Self { iterator: it, fuse_flag: 0, hint_kind, @@ -128,64 +121,66 @@ impl Iter where HK: HintKind } impl Iterator for Iter - where Range: Iterator, - as Iterator>::Item: Default, - HK: HintKind, +where + Range: Iterator, + as Iterator>::Item: Default, + HK: HintKind, { type Item = as Iterator>::Item; - fn next(&mut self) -> Option - { + fn next(&mut self) -> Option { let elt = self.iterator.next(); if elt.is_none() { self.fuse_flag += 1; // check fuse flag if self.fuse_flag == 2 { - return Some(Default::default()) + return Some(Default::default()); } } elt } - fn size_hint(&self) -> (usize, Option) - { + fn size_hint(&self) -> (usize, Option) { let org_hint = self.iterator.size_hint(); self.hint_kind.loosen_bounds(org_hint) } } impl DoubleEndedIterator for Iter - where Range: DoubleEndedIterator, - as Iterator>::Item: Default, - HK: HintKind +where + Range: DoubleEndedIterator, + as Iterator>::Item: Default, + HK: HintKind, { - fn next_back(&mut self) -> Option { self.iterator.next_back() } + fn next_back(&mut self) -> Option { + self.iterator.next_back() + } } -impl ExactSizeIterator for Iter where Range: ExactSizeIterator, +impl ExactSizeIterator for Iter +where + Range: ExactSizeIterator, as Iterator>::Item: Default, -{ } +{ +} impl qc::Arbitrary for Iter - where T: qc::Arbitrary, - HK: HintKind, +where + T: qc::Arbitrary, + HK: HintKind, { - fn arbitrary(g: &mut G) -> Self - { - Iter::new(T::arbitrary(g)..T::arbitrary(g), HK::arbitrary(g)) + fn arbitrary(g: &mut G) -> Self { + Self::new(T::arbitrary(g)..T::arbitrary(g), HK::arbitrary(g)) } - fn shrink(&self) -> Box>> - { + fn shrink(&self) -> Box> { let r = self.iterator.clone(); let hint_kind = self.hint_kind; - Box::new( - r.start.shrink().flat_map(move |a| - r.end.shrink().map(move |b| - Iter::new(a.clone()..b, hint_kind) - ) - ) - ) + Box::new(r.start.shrink().flat_map(move |a| { + r.end + .shrink() + .map(move |b| Self::new(a.clone()..b, hint_kind)) + })) } } @@ -201,7 +196,10 @@ struct ShiftRange { hint_kind: HK, } -impl Iterator for ShiftRange where HK: HintKind { +impl Iterator for ShiftRange +where + HK: HintKind, +{ type Item = Iter; fn next(&mut self) -> Option { @@ -219,10 +217,11 @@ impl Iterator for ShiftRange where HK: HintKind { } } -impl ExactSizeIterator for ShiftRange { } +impl ExactSizeIterator for ShiftRange {} impl qc::Arbitrary for ShiftRange - where HK: HintKind +where + HK: HintKind, { fn arbitrary(g: &mut G) -> Self { const MAX_STARTING_RANGE_DIFF: i32 = 32; @@ -236,7 +235,7 @@ impl qc::Arbitrary for ShiftRange let iter_count = g.gen_range(0, MAX_ITER_COUNT + 1); let hint_kind = qc::Arbitrary::arbitrary(g); - ShiftRange { + Self { range_start, range_end, start_step, @@ -250,7 +249,7 @@ impl qc::Arbitrary for ShiftRange fn correct_count(get_it: F) -> bool where I: Iterator, - F: Fn() -> I + F: Fn() -> I, { let mut counts = vec![get_it().count()]; @@ -258,7 +257,6 @@ where let mut it = get_it(); for _ in 0..(counts.len() - 1) { - #[allow(clippy::manual_assert)] if it.next().is_none() { panic!("Iterator shouldn't be finished, may not be deterministic"); } @@ -276,7 +274,10 @@ where for (i, returned_count) in counts.into_iter().enumerate() { let actual_count = total_actual_count - i; if actual_count != returned_count { - println!("Total iterations: {} True count: {} returned count: {}", i, actual_count, returned_count); + println!( + "Total iterations: {} True count: {} returned count: {}", + i, actual_count, returned_count + ); return false; } @@ -299,12 +300,10 @@ fn correct_size_hint(mut it: I) -> bool { // check all the size hints for &(low, hi) in &hints { true_count -= 1; - if low > true_count || - (hi.is_some() && hi.unwrap() < true_count) - { + if low > true_count || (hi.is_some() && hi.unwrap() < true_count) { println!("True size: {:?}, size hint: {:?}", true_count, (low, hi)); //println!("All hints: {:?}", hints); - return false + return false; } } true @@ -313,13 +312,19 @@ fn correct_size_hint(mut it: I) -> bool { fn exact_size(mut it: I) -> bool { // check every iteration let (mut low, mut hi) = it.size_hint(); - if Some(low) != hi { return false; } + if Some(low) != hi { + return false; + } while let Some(_) = it.next() { let (xlow, xhi) = it.size_hint(); - if low != xlow + 1 { return false; } + if low != xlow + 1 { + return false; + } low = xlow; hi = xhi; - if Some(low) != hi { return false; } + if Some(low) != hi { + return false; + } } let (low, hi) = it.size_hint(); low == 0 && hi == Some(0) @@ -329,13 +334,19 @@ fn exact_size(mut it: I) -> bool { fn exact_size_for_this(mut it: I) -> bool { // check every iteration let (mut low, mut hi) = it.size_hint(); - if Some(low) != hi { return false; } + if Some(low) != hi { + return false; + } while let Some(_) = it.next() { let (xlow, xhi) = it.size_hint(); - if low != xlow + 1 { return false; } + if low != xlow + 1 { + return false; + } low = xlow; hi = xhi; - if Some(low) != hi { return false; } + if Some(low) != hi { + return false; + } } let (low, hi) = it.size_hint(); low == 0 && hi == Some(0) @@ -442,43 +453,10 @@ quickcheck! { assert_eq!(answer.into_iter().last(), a.multi_cartesian_product().last()); } - #[allow(deprecated)] - fn size_step(a: Iter, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let filt = a.clone().dedup(); - correct_size_hint(filt.step(s)) && - exact_size(a.step(s)) - } - - #[allow(deprecated)] - fn equal_step(a: Iter, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let mut i = 0; - itertools::equal(a.clone().step(s), a.filter(|_| { - let keep = i % s == 0; - i += 1; - keep - })) - } - - #[allow(deprecated)] - fn equal_step_vec(a: Vec, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let mut i = 0; - itertools::equal(a.iter().step(s), a.iter().filter(|_| { - let keep = i % s == 0; - i += 1; - keep - })) + fn correct_empty_multi_product() -> () { + let empty = Vec::>::new().into_iter().multi_cartesian_product(); + assert!(correct_size_hint(empty.clone())); + itertools::assert_equal(empty, std::iter::once(Vec::new())) } fn size_multipeek(a: Iter, s: u8) -> bool { @@ -596,6 +574,20 @@ quickcheck! { let b = &b[..len]; itertools::equal(zip_eq(a, b), zip(a, b)) } + + #[should_panic] + fn zip_eq_panics(a: Vec, b: Vec) -> TestResult { + if a.len() == b.len() { return TestResult::discard(); } + zip_eq(a.iter(), b.iter()).for_each(|_| {}); + TestResult::passed() // won't come here + } + + fn equal_positions(a: Vec) -> bool { + let with_pos = a.iter().positions(|v| v % 2 == 0); + let without = a.iter().enumerate().filter(|(_, v)| *v % 2 == 0).map(|(i, _)| i); + itertools::equal(with_pos.clone(), without.clone()) + && itertools::equal(with_pos.rev(), without.rev()) + } fn size_zip_longest(a: Iter, b: Iter) -> bool { let filt = a.clone().dedup(); let filt2 = b.clone().dedup(); @@ -750,6 +742,56 @@ quickcheck! { } } +quickcheck! { + fn correct_peek_nth(mut a: Vec) -> () { + let mut it = peek_nth(a.clone()); + for start_pos in 0..a.len() + 2 { + for real_idx in start_pos..a.len() + 2 { + let peek_idx = real_idx - start_pos; + assert_eq!(it.peek_nth(peek_idx), a.get(real_idx)); + assert_eq!(it.peek_nth_mut(peek_idx), a.get_mut(real_idx)); + } + assert_eq!(it.next(), a.get(start_pos).copied()); + } + } + + fn peek_nth_mut_replace(a: Vec, b: Vec) -> () { + let mut it = peek_nth(a.iter()); + for (i, m) in b.iter().enumerate().take(a.len().min(b.len())) { + *it.peek_nth_mut(i).unwrap() = m; + } + for (i, m) in a.iter().enumerate() { + assert_eq!(it.next().unwrap(), b.get(i).unwrap_or(m)); + } + assert_eq!(it.next(), None); + assert_eq!(it.next(), None); + } + + fn peek_nth_next_if(a: Vec) -> () { + let mut it = peek_nth(a.clone()); + for (idx, mut value) in a.iter().copied().enumerate() { + let should_be_none = it.next_if(|x| x != &value); + assert_eq!(should_be_none, None); + if value % 5 == 0 { + // Sometimes, peek up to 3 further. + let n = value as usize % 3; + let nth = it.peek_nth(n); + assert_eq!(nth, a.get(idx + n)); + } else if value % 5 == 1 { + // Sometimes, peek next element mutably. + if let Some(v) = it.peek_mut() { + *v = v.wrapping_sub(1); + let should_be_none = it.next_if_eq(&value); + assert_eq!(should_be_none, None); + value = value.wrapping_sub(1); + } + } + let eq = it.next_if_eq(&value); + assert_eq!(eq, Some(value)); + } + } +} + quickcheck! { fn dedup_via_coalesce(a: Vec) -> bool { let mut b = a.clone(); @@ -811,9 +853,8 @@ quickcheck! { quickcheck! { fn size_put_back(a: Vec, x: Option) -> bool { let mut it = put_back(a.into_iter()); - match x { - Some(t) => it.put_back(t), - None => {} + if let Some(t) = x { + it.put_back(t); } correct_size_hint(it) } @@ -829,6 +870,31 @@ quickcheck! { } } +quickcheck! { + fn merge_join_by_ordering_vs_bool(a: Vec, b: Vec) -> bool { + use either::Either; + use itertools::free::merge_join_by; + let mut has_equal = false; + let it_ord = merge_join_by(a.clone(), b.clone(), Ord::cmp).flat_map(|v| match v { + EitherOrBoth::Both(l, r) => { + has_equal = true; + vec![Either::Left(l), Either::Right(r)] + } + EitherOrBoth::Left(l) => vec![Either::Left(l)], + EitherOrBoth::Right(r) => vec![Either::Right(r)], + }); + let it_bool = merge_join_by(a, b, PartialOrd::le); + itertools::equal(it_ord, it_bool) || has_equal + } + fn merge_join_by_bool_unwrapped_is_merge_by(a: Vec, b: Vec) -> bool { + use either::Either; + use itertools::free::merge_join_by; + let it = a.clone().into_iter().merge_by(b.clone(), PartialOrd::ge); + let it_join = merge_join_by(a, b, PartialOrd::ge).map(Either::into_inner); + itertools::equal(it, it_join) + } +} + quickcheck! { fn size_tee(a: Vec) -> bool { let (mut t1, mut t2) = a.iter().tee(); @@ -870,8 +936,31 @@ quickcheck! { } quickcheck! { - fn size_combinations(it: Iter) -> bool { - correct_size_hint(it.tuple_combinations::<(_, _)>()) + fn size_combinations(a: Iter) -> bool { + let it = a.clone().tuple_combinations::<(_, _)>(); + correct_size_hint(it.clone()) && it.count() == binomial(a.count(), 2) + } + + fn exact_size_combinations_1(a: Vec) -> bool { + let it = a.iter().tuple_combinations::<(_,)>(); + exact_size_for_this(it.clone()) && it.count() == binomial(a.len(), 1) + } + fn exact_size_combinations_2(a: Vec) -> bool { + let it = a.iter().tuple_combinations::<(_, _)>(); + exact_size_for_this(it.clone()) && it.count() == binomial(a.len(), 2) + } + fn exact_size_combinations_3(mut a: Vec) -> bool { + a.truncate(15); + let it = a.iter().tuple_combinations::<(_, _, _)>(); + exact_size_for_this(it.clone()) && it.count() == binomial(a.len(), 3) + } +} + +fn binomial(n: usize, k: usize) -> usize { + if k > n { + 0 + } else { + (n - k + 1..=n).product::() / (1..=k).product::() } } @@ -887,7 +976,7 @@ quickcheck! { } } } - cmb.next() == None + cmb.next().is_none() } } @@ -936,63 +1025,74 @@ quickcheck! { } quickcheck! { - fn fuzz_group_by_lazy_1(it: Iter) -> bool { + fn fuzz_chunk_by_lazy_1(it: Iter) -> bool { let jt = it.clone(); - let groups = it.group_by(|k| *k); - itertools::equal(jt, groups.into_iter().flat_map(|(_, x)| x)) + let chunks = it.chunk_by(|k| *k); + itertools::equal(jt, chunks.into_iter().flat_map(|(_, x)| x)) } } quickcheck! { - fn fuzz_group_by_lazy_2(data: Vec) -> bool { - let groups = data.iter().group_by(|k| *k / 10); - let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x)); + fn fuzz_chunk_by_lazy_2(data: Vec) -> bool { + let chunks = data.iter().chunk_by(|k| *k / 10); + let res = itertools::equal(data.iter(), chunks.into_iter().flat_map(|(_, x)| x)); res } } quickcheck! { - fn fuzz_group_by_lazy_3(data: Vec) -> bool { - let grouper = data.iter().group_by(|k| *k / 10); - let groups = grouper.into_iter().collect_vec(); - let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x)); + fn fuzz_chunk_by_lazy_3(data: Vec) -> bool { + let grouper = data.iter().chunk_by(|k| *k / 10); + let chunks = grouper.into_iter().collect_vec(); + let res = itertools::equal(data.iter(), chunks.into_iter().flat_map(|(_, x)| x)); res } } quickcheck! { - fn fuzz_group_by_lazy_duo(data: Vec, order: Vec<(bool, bool)>) -> bool { - let grouper = data.iter().group_by(|k| *k / 3); - let mut groups1 = grouper.into_iter(); - let mut groups2 = grouper.into_iter(); + fn fuzz_chunk_by_lazy_duo(data: Vec, order: Vec<(bool, bool)>) -> bool { + let grouper = data.iter().chunk_by(|k| *k / 3); + let mut chunks1 = grouper.into_iter(); + let mut chunks2 = grouper.into_iter(); let mut elts = Vec::<&u8>::new(); - let mut old_groups = Vec::new(); + let mut old_chunks = Vec::new(); let tup1 = |(_, b)| b; for &(ord, consume_now) in &order { - let iter = &mut [&mut groups1, &mut groups2][ord as usize]; + let iter = &mut [&mut chunks1, &mut chunks2][ord as usize]; match iter.next() { Some((_, gr)) => if consume_now { - for og in old_groups.drain(..) { + for og in old_chunks.drain(..) { elts.extend(og); } elts.extend(gr); } else { - old_groups.push(gr); + old_chunks.push(gr); }, None => break, } } - for og in old_groups.drain(..) { + for og in old_chunks.drain(..) { elts.extend(og); } - for gr in groups1.map(&tup1) { elts.extend(gr); } - for gr in groups2.map(&tup1) { elts.extend(gr); } + for gr in chunks1.map(&tup1) { elts.extend(gr); } + for gr in chunks2.map(&tup1) { elts.extend(gr); } itertools::assert_equal(&data, elts); true } } +quickcheck! { + fn chunk_clone_equal(a: Vec, size: u8) -> () { + let mut size = size; + if size == 0 { + size += 1; + } + let it = a.chunks(size as usize); + itertools::assert_equal(it.clone(), it); + } +} + quickcheck! { fn equal_chunks_lazy(a: Vec, size: u8) -> bool { let mut size = size; @@ -1010,7 +1110,75 @@ quickcheck! { } } +// tuple iterators quickcheck! { + fn equal_circular_tuple_windows_1(a: Vec) -> bool { + let x = a.iter().map(|e| (e,) ); + let y = a.iter().circular_tuple_windows::<(_,)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_2(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_3(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + &a[(start_idx + 2) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_4(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + &a[(start_idx + 2) % a.len()], + &a[(start_idx + 3) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows(a: Vec) -> bool { + let x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows_noninitial(a: Vec) -> bool { + let mut x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + let _ = x.next(); + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows_complete(a: Vec) -> bool { + let mut x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + for _ in x.by_ref() {} + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + + fn circular_tuple_windows_exact_size(a: Vec) -> bool { + exact_size(a.iter().circular_tuple_windows::<(_, _, _, _)>()) + } + fn equal_tuple_windows_1(a: Vec) -> bool { let x = a.windows(1).map(|s| (&s[0], )); let y = a.iter().tuple_windows::<(_,)>(); @@ -1035,6 +1203,14 @@ quickcheck! { itertools::equal(x, y) } + fn tuple_windows_exact_size_1(a: Vec) -> bool { + exact_size(a.iter().tuple_windows::<(_,)>()) + } + + fn tuple_windows_exact_size_4(a: Vec) -> bool { + exact_size(a.iter().tuple_windows::<(_, _, _, _)>()) + } + fn equal_tuples_1(a: Vec) -> bool { let x = a.chunks(1).map(|s| (&s[0], )); let y = a.iter().tuples::<(_,)>(); @@ -1066,6 +1242,18 @@ quickcheck! { assert_eq!(buffer.len(), a.len() % 4); exact_size(buffer) } + + fn tuples_size_hint_inexact(a: Iter) -> bool { + correct_size_hint(a.clone().tuples::<(_,)>()) + && correct_size_hint(a.clone().tuples::<(_, _)>()) + && correct_size_hint(a.tuples::<(_, _, _, _)>()) + } + + fn tuples_size_hint_exact(a: Iter) -> bool { + exact_size(a.clone().tuples::<(_,)>()) + && exact_size(a.clone().tuples::<(_, _)>()) + && exact_size(a.tuples::<(_, _, _, _)>()) + } } // with_position @@ -1097,14 +1285,14 @@ quickcheck! { #[derive(Clone, Debug, PartialEq, Eq)] struct Val(u32, u32); -impl PartialOrd for Val { - fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) +impl PartialOrd for Val { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) } } impl Ord for Val { - fn cmp(&self, other: &Val) -> Ordering { + fn cmp(&self, other: &Self) -> Ordering { self.0.cmp(&other.0) } } @@ -1112,10 +1300,10 @@ impl Ord for Val { impl qc::Arbitrary for Val { fn arbitrary(g: &mut G) -> Self { let (x, y) = <(u32, u32)>::arbitrary(g); - Val(x, y) + Self(x, y) } fn shrink(&self) -> Box> { - Box::new((self.0, self.1).shrink().map(|(x, y)| Val(x, y))) + Box::new((self.0, self.1).shrink().map(|(x, y)| Self(x, y))) } } @@ -1157,13 +1345,12 @@ quickcheck! { } quickcheck! { - #[allow(deprecated)] - fn tree_fold1_f64(mut a: Vec) -> TestResult { + fn tree_reduce_f64(mut a: Vec) -> TestResult { fn collapse_adjacent(x: Vec, mut f: F) -> Vec where F: FnMut(f64, f64) -> f64 { let mut out = Vec::new(); - for i in (0..x.len()).step(2) { + for i in (0..x.len()).step_by(2) { if i == x.len()-1 { out.push(x[i]) } else { @@ -1177,7 +1364,7 @@ quickcheck! { return TestResult::discard(); } - let actual = a.iter().cloned().tree_fold1(f64::atan2); + let actual = a.iter().cloned().tree_reduce(f64::atan2); while a.len() > 1 { a = collapse_adjacent(a, f64::atan2); @@ -1202,7 +1389,7 @@ quickcheck! { fn at_most_one_i32(a: Vec) -> TestResult { let ret = a.iter().cloned().at_most_one(); match a.len() { - 0 => TestResult::from_bool(ret.unwrap() == None), + 0 => TestResult::from_bool(ret.unwrap().is_none()), 1 => TestResult::from_bool(ret.unwrap() == Some(a[0])), _ => TestResult::from_bool(ret.unwrap_err().eq(a.iter().cloned())), } @@ -1232,7 +1419,7 @@ quickcheck! { Some(acc.unwrap_or(0) + val) } }); - + let group_map_lookup = a.iter() .map(|&b| b as u64) .map(|i| (i % modulo, i)) @@ -1252,7 +1439,7 @@ quickcheck! { for m in 0..modulo { assert_eq!( - lookup.get(&m).copied(), + lookup.get(&m).copied(), a.iter() .map(|&b| b as u64) .filter(|&val| val % modulo == m) @@ -1267,6 +1454,35 @@ quickcheck! { } } + fn correct_grouping_map_by_fold_with_modulo_key(a: Vec, modulo: u8) -> () { + #[derive(Debug, Default, PartialEq)] + struct Accumulator { + acc: u64, + } + + let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` + let lookup = a.iter().map(|&b| b as u64) // Avoid overflows + .into_grouping_map_by(|i| i % modulo) + .fold_with(|_key, _val| Default::default(), |Accumulator { acc }, &key, val| { + assert!(val % modulo == key); + let acc = acc + val; + Accumulator { acc } + }); + + let group_map_lookup = a.iter() + .map(|&b| b as u64) + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().sum())).map(|(key, acc)| (key,Accumulator { acc })) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &Accumulator { acc: sum }) in lookup.iter() { + assert_eq!(sum, a.iter().map(|&b| b as u64).filter(|&val| val % modulo == key).sum::()); + } + } + fn correct_grouping_map_by_fold_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` let lookup = a.iter().map(|&b| b as u64) // Avoid overflows @@ -1290,22 +1506,21 @@ quickcheck! { } } - fn correct_grouping_map_by_fold_first_modulo_key(a: Vec, modulo: u8) -> () { + fn correct_grouping_map_by_reduce_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` let lookup = a.iter().map(|&b| b as u64) // Avoid overflows .into_grouping_map_by(|i| i % modulo) - .fold_first(|acc, &key, val| { + .reduce(|acc, &key, val| { assert!(val % modulo == key); acc + val }); - // TODO: Swap `fold1` with stdlib's `fold_first` when it's stabilized let group_map_lookup = a.iter() .map(|&b| b as u64) .map(|i| (i % modulo, i)) .into_group_map() .into_iter() - .map(|(key, vals)| (key, vals.into_iter().fold1(|acc, val| acc + val).unwrap())) + .map(|(key, vals)| (key, vals.into_iter().reduce(|acc, val| acc + val).unwrap())) .collect::>(); assert_eq!(lookup, group_map_lookup); @@ -1372,7 +1587,7 @@ quickcheck! { assert_eq!(Some(max), a.iter().copied().filter(|&val| val % modulo == key).max_by_key(|&val| val)); } } - + fn correct_grouping_map_by_min_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).min(); @@ -1423,7 +1638,7 @@ quickcheck! { assert_eq!(Some(min), a.iter().copied().filter(|&val| val % modulo == key).min_by_key(|&val| val)); } } - + fn correct_grouping_map_by_minmax_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).minmax(); @@ -1536,7 +1751,7 @@ quickcheck! { .min_by(|_, _, _| Ordering::Equal); assert_eq!(lookup[&0], 0); - + let lookup = (0..=10) .into_grouping_map_by(|_| 0) .minmax_by(|_, _, _| Ordering::Equal); @@ -1594,12 +1809,10 @@ quickcheck! { } } - -fn is_fused(mut it: I) -> bool -{ +fn is_fused(mut it: I) -> bool { for _ in it.by_ref() {} - for _ in 0..10{ - if it.next().is_some(){ + for _ in 0..10 { + if it.next().is_some() { return false; } } @@ -1640,7 +1853,7 @@ quickcheck! { !is_fused(a.clone().interleave_shortest(b.clone())) && is_fused(a.fuse().interleave_shortest(b.fuse())) } - + fn fused_product(a: Iter, b: Iter) -> bool { is_fused(a.fuse().cartesian_product(b.fuse())) @@ -1746,4 +1959,11 @@ quickcheck! { result_set.is_empty() } } + + fn tail(v: Vec, n: u8) -> bool { + let n = n as usize; + let result = &v[v.len().saturating_sub(n)..]; + itertools::equal(v.iter().tail(n), result) + && itertools::equal(v.iter().filter(|_| true).tail(n), result) + } } diff --git a/third_party/rust/itertools/tests/specializations.rs b/third_party/rust/itertools/tests/specializations.rs index 057e11c9f67..e6694c8e7a3 100644 --- a/third_party/rust/itertools/tests/specializations.rs +++ b/third_party/rust/itertools/tests/specializations.rs @@ -1,8 +1,20 @@ +//! Test specializations of methods with default impls match the behavior of the +//! default impls. +//! +//! **NOTE:** Due to performance limitations, these tests are not run with miri! +//! They cannot be relied upon to discover soundness issues. + +#![cfg(not(miri))] +#![allow(unstable_name_collisions)] + use itertools::Itertools; +use quickcheck::Arbitrary; +use quickcheck::{quickcheck, TestResult}; +use rand::Rng; use std::fmt::Debug; -use quickcheck::quickcheck; struct Unspecialized(I); + impl Iterator for Unspecialized where I: Iterator, @@ -15,30 +27,41 @@ where } } -macro_rules! check_specialized { - ($src:expr, |$it:pat| $closure:expr) => { - let $it = $src.clone(); - let v1 = $closure; - - let $it = Unspecialized($src.clone()); - let v2 = $closure; - - assert_eq!(v1, v2); +impl DoubleEndedIterator for Unspecialized +where + I: DoubleEndedIterator, +{ + #[inline(always)] + fn next_back(&mut self) -> Option { + self.0.next_back() } } -fn test_specializations( - it: &Iter, -) where - IterItem: Eq + Debug + Clone, - Iter: Iterator + Clone, +fn test_specializations(it: &I) +where + I::Item: Eq + Debug + Clone, + I: Iterator + Clone, { + macro_rules! check_specialized { + ($src:expr, |$it:pat| $closure:expr) => { + // Many iterators special-case the first elements, so we test specializations for iterators that have already been advanced. + let mut src = $src.clone(); + for _ in 0..5 { + let $it = src.clone(); + let v1 = $closure; + let $it = Unspecialized(src.clone()); + let v2 = $closure; + assert_eq!(v1, v2); + src.next(); + } + } + } check_specialized!(it, |i| i.count()); check_specialized!(it, |i| i.last()); check_specialized!(it, |i| i.collect::>()); check_specialized!(it, |i| { let mut parameters_from_fold = vec![]; - let fold_result = i.fold(vec![], |mut acc, v: IterItem| { + let fold_result = i.fold(vec![], |mut acc, v: I::Item| { parameters_from_fold.push((acc.clone(), v.clone())); acc.push(v); acc @@ -50,7 +73,7 @@ fn test_specializations( let first = i.next(); let all_result = i.all(|x| { parameters_from_all.push(x.clone()); - Some(x)==first + Some(x) == first }); (parameters_from_all, all_result) }); @@ -72,10 +95,270 @@ fn test_specializations( } } +fn test_double_ended_specializations(it: &I) +where + I::Item: Eq + Debug + Clone, + I: DoubleEndedIterator + Clone, +{ + macro_rules! check_specialized { + ($src:expr, |$it:pat| $closure:expr) => { + // Many iterators special-case the first elements, so we test specializations for iterators that have already been advanced. + let mut src = $src.clone(); + for step in 0..8 { + let $it = src.clone(); + let v1 = $closure; + let $it = Unspecialized(src.clone()); + let v2 = $closure; + assert_eq!(v1, v2); + if step % 2 == 0 { + src.next(); + } else { + src.next_back(); + } + } + } + } + check_specialized!(it, |i| { + let mut parameters_from_rfold = vec![]; + let rfold_result = i.rfold(vec![], |mut acc, v: I::Item| { + parameters_from_rfold.push((acc.clone(), v.clone())); + acc.push(v); + acc + }); + (parameters_from_rfold, rfold_result) + }); + let size = it.clone().count(); + for n in 0..size + 2 { + check_specialized!(it, |mut i| i.nth_back(n)); + } +} + quickcheck! { + fn interleave(v: Vec, w: Vec) -> () { + test_specializations(&v.iter().interleave(w.iter())); + } + + fn interleave_shortest(v: Vec, w: Vec) -> () { + test_specializations(&v.iter().interleave_shortest(w.iter())); + } + + fn batching(v: Vec) -> () { + test_specializations(&v.iter().batching(Iterator::next)); + } + + fn tuple_windows(v: Vec) -> () { + test_specializations(&v.iter().tuple_windows::<(_,)>()); + test_specializations(&v.iter().tuple_windows::<(_, _)>()); + test_specializations(&v.iter().tuple_windows::<(_, _, _)>()); + } + + fn circular_tuple_windows(v: Vec) -> () { + test_specializations(&v.iter().circular_tuple_windows::<(_,)>()); + test_specializations(&v.iter().circular_tuple_windows::<(_, _)>()); + test_specializations(&v.iter().circular_tuple_windows::<(_, _, _)>()); + } + + fn tuples(v: Vec) -> () { + test_specializations(&v.iter().tuples::<(_,)>()); + test_specializations(&v.iter().tuples::<(_, _)>()); + test_specializations(&v.iter().tuples::<(_, _, _)>()); + } + + fn cartesian_product(a: Vec, b: Vec) -> TestResult { + if a.len() * b.len() > 100 { + return TestResult::discard(); + } + test_specializations(&a.iter().cartesian_product(&b)); + TestResult::passed() + } + + fn multi_cartesian_product(a: Vec, b: Vec, c: Vec) -> TestResult { + if a.len() * b.len() * c.len() > 100 { + return TestResult::discard(); + } + test_specializations(&vec![a, b, c].into_iter().multi_cartesian_product()); + TestResult::passed() + } + + fn coalesce(v: Vec) -> () { + test_specializations(&v.iter().coalesce(|x, y| if x == y { Ok(x) } else { Err((x, y)) })) + } + + fn dedup(v: Vec) -> () { + test_specializations(&v.iter().dedup()) + } + + fn dedup_by(v: Vec) -> () { + test_specializations(&v.iter().dedup_by(PartialOrd::ge)) + } + + fn dedup_with_count(v: Vec) -> () { + test_specializations(&v.iter().dedup_with_count()) + } + + fn dedup_by_with_count(v: Vec) -> () { + test_specializations(&v.iter().dedup_by_with_count(PartialOrd::ge)) + } + + fn duplicates(v: Vec) -> () { + let it = v.iter().duplicates(); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn duplicates_by(v: Vec) -> () { + let it = v.iter().duplicates_by(|x| *x % 10); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn unique(v: Vec) -> () { + let it = v.iter().unique(); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn unique_by(v: Vec) -> () { + let it = v.iter().unique_by(|x| *x % 50); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn take_while_inclusive(v: Vec) -> () { + test_specializations(&v.iter().copied().take_while_inclusive(|&x| x < 100)); + } + + fn while_some(v: Vec) -> () { + test_specializations(&v.iter().map(|&x| if x < 100 { Some(2 * x) } else { None }).while_some()); + } + + fn pad_using(v: Vec) -> () { + use std::convert::TryFrom; + let it = v.iter().copied().pad_using(10, |i| u8::try_from(5 * i).unwrap_or(u8::MAX)); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn with_position(v: Vec) -> () { + test_specializations(&v.iter().with_position()); + } + + fn positions(v: Vec) -> () { + let it = v.iter().positions(|x| x % 5 == 0); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn update(v: Vec) -> () { + let it = v.iter().copied().update(|x| *x = x.wrapping_mul(7)); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn tuple_combinations(v: Vec) -> TestResult { + if v.len() > 10 { + return TestResult::discard(); + } + test_specializations(&v.iter().tuple_combinations::<(_,)>()); + test_specializations(&v.iter().tuple_combinations::<(_, _)>()); + test_specializations(&v.iter().tuple_combinations::<(_, _, _)>()); + TestResult::passed() + } + fn intersperse(v: Vec) -> () { test_specializations(&v.into_iter().intersperse(0)); } + + fn intersperse_with(v: Vec) -> () { + test_specializations(&v.into_iter().intersperse_with(|| 0)); + } + + fn array_combinations(v: Vec) -> TestResult { + if v.len() > 10 { + return TestResult::discard(); + } + test_specializations(&v.iter().array_combinations::<1>()); + test_specializations(&v.iter().array_combinations::<2>()); + test_specializations(&v.iter().array_combinations::<3>()); + TestResult::passed() + } + + fn combinations(a: Vec, n: u8) -> TestResult { + if n > 3 || a.len() > 8 { + return TestResult::discard(); + } + test_specializations(&a.iter().combinations(n as usize)); + TestResult::passed() + } + + fn combinations_with_replacement(a: Vec, n: u8) -> TestResult { + if n > 3 || a.len() > 7 { + return TestResult::discard(); + } + test_specializations(&a.iter().combinations_with_replacement(n as usize)); + TestResult::passed() + } + + fn permutations(a: Vec, n: u8) -> TestResult { + if n > 3 || a.len() > 8 { + return TestResult::discard(); + } + test_specializations(&a.iter().permutations(n as usize)); + TestResult::passed() + } + + fn powerset(a: Vec) -> TestResult { + if a.len() > 6 { + return TestResult::discard(); + } + test_specializations(&a.iter().powerset()); + TestResult::passed() + } + + fn zip_longest(a: Vec, b: Vec) -> () { + let it = a.into_iter().zip_longest(b); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn zip_eq(a: Vec) -> () { + test_specializations(&a.iter().zip_eq(a.iter().rev())) + } + + fn multizip(a: Vec) -> () { + let it = itertools::multizip((a.iter(), a.iter().rev(), a.iter().take(50))); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn izip(a: Vec, b: Vec) -> () { + test_specializations(&itertools::izip!(b.iter(), a, b.iter().rev())); + } + + fn iproduct(a: Vec, b: Vec, c: Vec) -> TestResult { + if a.len() * b.len() * c.len() > 200 { + return TestResult::discard(); + } + test_specializations(&itertools::iproduct!(a, b.iter(), c)); + TestResult::passed() + } + + fn repeat_n(element: i8, n: u8) -> () { + let it = itertools::repeat_n(element, n as usize); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn exactly_one_error(v: Vec) -> TestResult { + // Use `at_most_one` would be similar. + match v.iter().exactly_one() { + Ok(_) => TestResult::discard(), + Err(it) => { + test_specializations(&it); + TestResult::passed() + } + } + } } quickcheck! { @@ -85,32 +368,128 @@ quickcheck! { pb.put_back(1); test_specializations(&pb); } + + fn put_back_n(v: Vec, n: u8) -> () { + let mut it = itertools::put_back_n(v); + for k in 0..n { + it.put_back(k); + } + test_specializations(&it); + } + + fn multipeek(v: Vec, n: u8) -> () { + let mut it = v.into_iter().multipeek(); + for _ in 0..n { + it.peek(); + } + test_specializations(&it); + } + + fn peek_nth_with_peek(v: Vec, n: u8) -> () { + let mut it = itertools::peek_nth(v); + for _ in 0..n { + it.peek(); + } + test_specializations(&it); + } + + fn peek_nth_with_peek_nth(v: Vec, n: u8) -> () { + let mut it = itertools::peek_nth(v); + it.peek_nth(n as usize); + test_specializations(&it); + } + + fn peek_nth_with_peek_mut(v: Vec, n: u8) -> () { + let mut it = itertools::peek_nth(v); + for _ in 0..n { + if let Some(x) = it.peek_mut() { + *x = x.wrapping_add(50); + } + } + test_specializations(&it); + } + + fn peek_nth_with_peek_nth_mut(v: Vec, n: u8) -> () { + let mut it = itertools::peek_nth(v); + if let Some(x) = it.peek_nth_mut(n as usize) { + *x = x.wrapping_add(50); + } + test_specializations(&it); + } } quickcheck! { - fn merge_join_by_qc(i1: Vec, i2: Vec) -> () { - test_specializations(&i1.into_iter().merge_join_by(i2.into_iter(), std::cmp::Ord::cmp)); + fn merge(a: Vec, b: Vec) -> () { + test_specializations(&a.into_iter().merge(b)) + } + + fn merge_by(a: Vec, b: Vec) -> () { + test_specializations(&a.into_iter().merge_by(b, PartialOrd::ge)) + } + + fn merge_join_by_ordering(i1: Vec, i2: Vec) -> () { + test_specializations(&i1.into_iter().merge_join_by(i2, Ord::cmp)); + } + + fn merge_join_by_bool(i1: Vec, i2: Vec) -> () { + test_specializations(&i1.into_iter().merge_join_by(i2, PartialOrd::ge)); + } + + fn kmerge(a: Vec, b: Vec, c: Vec) -> () { + test_specializations(&vec![a, b, c] + .into_iter() + .map(|v| v.into_iter().sorted()) + .kmerge()); + } + + fn kmerge_by(a: Vec, b: Vec, c: Vec) -> () { + test_specializations(&vec![a, b, c] + .into_iter() + .map(|v| v.into_iter().sorted_by_key(|a| a.abs())) + .kmerge_by(|a, b| a.abs() < b.abs())); } } quickcheck! { fn map_into(v: Vec) -> () { - test_specializations(&v.into_iter().map_into::()); + let it = v.into_iter().map_into::(); + test_specializations(&it); + test_double_ended_specializations(&it); } -} -quickcheck! { fn map_ok(v: Vec>) -> () { - test_specializations(&v.into_iter().map_ok(|u| u.checked_add(1))); + let it = v.into_iter().map_ok(|u| u.checked_add(1)); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn filter_ok(v: Vec>) -> () { + let it = v.into_iter().filter_ok(|&i| i < 20); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn filter_map_ok(v: Vec>) -> () { + let it = v.into_iter().filter_map_ok(|i| if i < 20 { Some(i * 2) } else { None }); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + // `SmallIter2` because `Vec` is too slow and we get bad coverage from a singleton like Option + fn flatten_ok(v: Vec, char>>) -> () { + let it = v.into_iter().flatten_ok(); + test_specializations(&it); + test_double_ended_specializations(&it); } } quickcheck! { + // TODO Replace this function by a normal call to test_specializations fn process_results(v: Vec>) -> () { helper(v.iter().copied()); helper(v.iter().copied().filter(Result::is_ok)); - fn helper(it: impl Iterator> + Clone) { + fn helper(it: impl DoubleEndedIterator> + Clone) { macro_rules! check_results_specialized { ($src:expr, |$it:pat| $closure:expr) => { assert_eq!( @@ -126,6 +505,7 @@ quickcheck! { check_results_specialized!(it, |i| i.count()); check_results_specialized!(it, |i| i.last()); check_results_specialized!(it, |i| i.collect::>()); + check_results_specialized!(it, |i| i.rev().collect::>()); check_results_specialized!(it, |i| { let mut parameters_from_fold = vec![]; let fold_result = i.fold(vec![], |mut acc, v| { @@ -135,6 +515,15 @@ quickcheck! { }); (parameters_from_fold, fold_result) }); + check_results_specialized!(it, |i| { + let mut parameters_from_rfold = vec![]; + let rfold_result = i.rfold(vec![], |mut acc, v| { + parameters_from_rfold.push((acc.clone(), v)); + acc.push(v); + acc + }); + (parameters_from_rfold, rfold_result) + }); check_results_specialized!(it, |mut i| { let mut parameters_from_all = vec![]; let first = i.next(); @@ -148,6 +537,67 @@ quickcheck! { for n in 0..size + 2 { check_results_specialized!(it, |mut i| i.nth(n)); } + for n in 0..size + 2 { + check_results_specialized!(it, |mut i| i.nth_back(n)); + } + } + } +} + +/// Like `VecIntoIter` with maximum 2 elements. +#[derive(Debug, Clone, Default)] +enum SmallIter2 { + #[default] + Zero, + One(T), + Two(T, T), +} + +impl Arbitrary for SmallIter2 { + fn arbitrary(g: &mut G) -> Self { + match g.gen_range(0u8, 3) { + 0 => Self::Zero, + 1 => Self::One(T::arbitrary(g)), + 2 => Self::Two(T::arbitrary(g), T::arbitrary(g)), + _ => unreachable!(), + } + } + // maybe implement shrink too, maybe not +} + +impl Iterator for SmallIter2 { + type Item = T; + + fn next(&mut self) -> Option { + match std::mem::take(self) { + Self::Zero => None, + Self::One(val) => Some(val), + Self::Two(val, second) => { + *self = Self::One(second); + Some(val) + } + } + } + + fn size_hint(&self) -> (usize, Option) { + let len = match self { + Self::Zero => 0, + Self::One(_) => 1, + Self::Two(_, _) => 2, + }; + (len, Some(len)) + } +} + +impl DoubleEndedIterator for SmallIter2 { + fn next_back(&mut self) -> Option { + match std::mem::take(self) { + Self::Zero => None, + Self::One(val) => Some(val), + Self::Two(first, val) => { + *self = Self::One(first); + Some(val) + } } } } diff --git a/third_party/rust/itertools/tests/test_core.rs b/third_party/rust/itertools/tests/test_core.rs index df94eb665fe..4936160850d 100644 --- a/third_party/rust/itertools/tests/test_core.rs +++ b/third_party/rust/itertools/tests/test_core.rs @@ -4,18 +4,71 @@ //! option. This file may not be copied, modified, or distributed //! except according to those terms. #![no_std] +#![allow(deprecated)] -use core::iter; -use itertools as it; -use crate::it::Itertools; +use crate::it::chain; +use crate::it::free::put_back; use crate::it::interleave; use crate::it::intersperse; use crate::it::intersperse_with; -use crate::it::multizip; -use crate::it::free::put_back; use crate::it::iproduct; use crate::it::izip; -use crate::it::chain; +use crate::it::multizip; +use crate::it::Itertools; +use core::iter; +use itertools as it; + +#[allow(dead_code)] +fn get_esi_then_esi(it: I) { + fn is_esi(_: impl ExactSizeIterator) {} + is_esi(it.clone().get(1..4)); + is_esi(it.clone().get(1..=4)); + is_esi(it.clone().get(1..)); + is_esi(it.clone().get(..4)); + is_esi(it.clone().get(..=4)); + is_esi(it.get(..)); +} + +#[allow(dead_code)] +fn get_dei_esi_then_dei_esi(it: I) { + fn is_dei_esi(_: impl DoubleEndedIterator + ExactSizeIterator) {} + is_dei_esi(it.clone().get(1..4)); + is_dei_esi(it.clone().get(1..=4)); + is_dei_esi(it.clone().get(1..)); + is_dei_esi(it.clone().get(..4)); + is_dei_esi(it.clone().get(..=4)); + is_dei_esi(it.get(..)); +} + +#[test] +fn get_1_max() { + let mut it = (0..5).get(1..=usize::MAX); + assert_eq!(it.next(), Some(1)); + assert_eq!(it.next_back(), Some(4)); +} + +#[test] +#[should_panic] +fn get_full_range_inclusive() { + let _it = (0..5).get(0..=usize::MAX); +} + +#[test] +fn product0() { + let mut prod = iproduct!(); + assert_eq!(prod.next(), Some(())); + assert!(prod.next().is_none()); +} + +#[test] +fn iproduct1() { + let s = "αβ"; + + let mut prod = iproduct!(s.chars()); + assert_eq!(prod.next(), Some(('α',))); + assert_eq!(prod.next(), Some(('β',))); + assert!(prod.next().is_none()); +} #[test] fn product2() { @@ -26,7 +79,7 @@ fn product2() { assert!(prod.next() == Some(('α', 1))); assert!(prod.next() == Some(('β', 0))); assert!(prod.next() == Some(('β', 1))); - assert!(prod.next() == None); + assert!(prod.next().is_none()); } #[test] @@ -34,13 +87,12 @@ fn product_temporary() { for (_x, _y, _z) in iproduct!( [0, 1, 2].iter().cloned(), [0, 1, 2].iter().cloned(), - [0, 1, 2].iter().cloned()) - { + [0, 1, 2].iter().cloned() + ) { // ok } } - #[test] fn izip_macro() { let mut zip = izip!(2..3); @@ -61,7 +113,7 @@ fn izip_macro() { #[test] fn izip2() { let _zip1: iter::Zip<_, _> = izip!(1.., 2..); - let _zip2: iter::Zip<_, _> = izip!(1.., 2.., ); + let _zip2: iter::Zip<_, _> = izip!(1.., 2..,); } #[test] @@ -109,7 +161,7 @@ fn chain_macro() { #[test] fn chain2() { let _ = chain!(1.., 2..); - let _ = chain!(1.., 2.., ); + let _ = chain!(1.., 2..,); } #[test] @@ -127,7 +179,7 @@ fn write_to() { #[test] fn test_interleave() { - let xs: [u8; 0] = []; + let xs: [u8; 0] = []; let ys = [7u8, 9, 8, 10]; let zs = [2u8, 77]; let it = interleave(xs.iter(), ys.iter()); @@ -155,15 +207,6 @@ fn test_intersperse_with() { it::assert_equal(it, ys.iter()); } -#[allow(deprecated)] -#[test] -fn foreach() { - let xs = [1i32, 2, 3]; - let mut sum = 0; - xs.iter().foreach(|elt| sum += *elt); - assert!(sum == 6); -} - #[test] fn dropping() { let xs = [1, 2, 3]; @@ -197,21 +240,11 @@ fn test_put_back() { it::assert_equal(pb, xs.iter().cloned()); } -#[allow(deprecated)] -#[test] -fn step() { - it::assert_equal((0..10).step(1), 0..10); - it::assert_equal((0..10).step(2), (0..10).filter(|x: &i32| *x % 2 == 0)); - it::assert_equal((0..10).step(10), 0..1); -} - -#[allow(deprecated)] #[test] fn merge() { - it::assert_equal((0..10).step(2).merge((1..10).step(2)), 0..10); + it::assert_equal((0..10).step_by(2).merge((1..10).step_by(2)), 0..10); } - #[test] fn repeatn() { let s = "α"; @@ -231,29 +264,33 @@ fn count_clones() { use core::cell::Cell; #[derive(PartialEq, Debug)] struct Foo { - n: Cell + n: Cell, } - impl Clone for Foo - { - fn clone(&self) -> Self - { + impl Clone for Foo { + fn clone(&self) -> Self { let n = self.n.get(); self.n.set(n + 1); - Foo { n: Cell::new(n + 1) } + Self { + n: Cell::new(n + 1), + } } } - for n in 0..10 { - let f = Foo{n: Cell::new(0)}; + let f = Foo { n: Cell::new(0) }; let it = it::repeat_n(f, n); // drain it let last = it.last(); if n == 0 { assert_eq!(last, None); } else { - assert_eq!(last, Some(Foo{n: Cell::new(n - 1)})); + assert_eq!( + last, + Some(Foo { + n: Cell::new(n - 1) + }) + ); } } } @@ -276,25 +313,45 @@ fn part() { } #[test] -fn tree_fold1() { +fn tree_reduce() { for i in 0..100 { - assert_eq!((0..i).tree_fold1(|x, y| x + y), (0..i).fold1(|x, y| x + y)); + assert_eq!((0..i).tree_reduce(|x, y| x + y), (0..i).fold1(|x, y| x + y)); } } #[test] fn exactly_one() { assert_eq!((0..10).filter(|&x| x == 2).exactly_one().unwrap(), 2); - assert!((0..10).filter(|&x| x > 1 && x < 4).exactly_one().unwrap_err().eq(2..4)); - assert!((0..10).filter(|&x| x > 1 && x < 5).exactly_one().unwrap_err().eq(2..5)); - assert!((0..10).filter(|&_| false).exactly_one().unwrap_err().eq(0..0)); + assert!((0..10) + .filter(|&x| x > 1 && x < 4) + .exactly_one() + .unwrap_err() + .eq(2..4)); + assert!((0..10) + .filter(|&x| x > 1 && x < 5) + .exactly_one() + .unwrap_err() + .eq(2..5)); + assert!((0..10) + .filter(|&_| false) + .exactly_one() + .unwrap_err() + .eq(0..0)); } #[test] fn at_most_one() { assert_eq!((0..10).filter(|&x| x == 2).at_most_one().unwrap(), Some(2)); - assert!((0..10).filter(|&x| x > 1 && x < 4).at_most_one().unwrap_err().eq(2..4)); - assert!((0..10).filter(|&x| x > 1 && x < 5).at_most_one().unwrap_err().eq(2..5)); + assert!((0..10) + .filter(|&x| x > 1 && x < 4) + .at_most_one() + .unwrap_err() + .eq(2..4)); + assert!((0..10) + .filter(|&x| x > 1 && x < 5) + .at_most_one() + .unwrap_err() + .eq(2..5)); assert_eq!((0..10).filter(|&_| false).at_most_one().unwrap(), None); } @@ -315,3 +372,28 @@ fn product1() { assert_eq!(v[1..3].iter().cloned().product1::(), Some(2)); assert_eq!(v[1..5].iter().cloned().product1::(), Some(24)); } + +#[test] +fn next_array() { + let v = [1, 2, 3, 4, 5]; + let mut iter = v.iter(); + assert_eq!(iter.next_array(), Some([])); + assert_eq!(iter.next_array().map(|[&x, &y]| [x, y]), Some([1, 2])); + assert_eq!(iter.next_array().map(|[&x, &y]| [x, y]), Some([3, 4])); + assert_eq!(iter.next_array::<2>(), None); +} + +#[test] +fn collect_array() { + let v = [1, 2]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_array(), Some([1, 2])); + + let v = [1]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_array::<2>(), None); + + let v = [1, 2, 3]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_array::<2>(), None); +} diff --git a/third_party/rust/itertools/tests/test_std.rs b/third_party/rust/itertools/tests/test_std.rs index f590342349d..ad391faad64 100644 --- a/third_party/rust/itertools/tests/test_std.rs +++ b/third_party/rust/itertools/tests/test_std.rs @@ -1,19 +1,26 @@ -use quickcheck as qc; -use rand::{distributions::{Distribution, Standard}, Rng, SeedableRng, rngs::StdRng}; -use rand::{seq::SliceRandom, thread_rng}; -use std::{cmp::min, fmt::Debug, marker::PhantomData}; -use itertools as it; -use crate::it::Itertools; -use crate::it::ExactlyOneError; -use crate::it::multizip; -use crate::it::multipeek; -use crate::it::peek_nth; -use crate::it::free::rciter; -use crate::it::free::put_back_n; -use crate::it::FoldWhile; +#![allow(unstable_name_collisions)] + use crate::it::cloned; +use crate::it::free::put_back_n; +use crate::it::free::rciter; use crate::it::iproduct; use crate::it::izip; +use crate::it::multipeek; +use crate::it::multizip; +use crate::it::peek_nth; +use crate::it::repeat_n; +use crate::it::ExactlyOneError; +use crate::it::FoldWhile; +use crate::it::Itertools; +use itertools as it; +use quickcheck as qc; +use rand::{ + distributions::{Distribution, Standard}, + rngs::StdRng, + Rng, SeedableRng, +}; +use rand::{seq::SliceRandom, thread_rng}; +use std::{cmp::min, fmt::Debug, marker::PhantomData}; #[test] fn product3() { @@ -27,28 +34,26 @@ fn product3() { } } } - for (_, _, _, _) in iproduct!(0..3, 0..2, 0..2, 0..3) { - /* test compiles */ - } + for (_, _, _, _) in iproduct!(0..3, 0..2, 0..2, 0..3) { /* test compiles */ } } #[test] fn interleave_shortest() { let v0: Vec = vec![0, 2, 4]; let v1: Vec = vec![1, 3, 5, 7]; - let it = v0.into_iter().interleave_shortest(v1.into_iter()); + let it = v0.into_iter().interleave_shortest(v1); assert_eq!(it.size_hint(), (6, Some(6))); assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5]); let v0: Vec = vec![0, 2, 4, 6, 8]; let v1: Vec = vec![1, 3, 5]; - let it = v0.into_iter().interleave_shortest(v1.into_iter()); + let it = v0.into_iter().interleave_shortest(v1); assert_eq!(it.size_hint(), (7, Some(7))); assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5, 6]); let i0 = ::std::iter::repeat(0); let v1: Vec<_> = vec![1, 3, 5]; - let it = i0.interleave_shortest(v1.into_iter()); + let it = i0.interleave_shortest(v1); assert_eq!(it.size_hint(), (7, Some(7))); let v0: Vec<_> = vec![0, 2, 4]; @@ -62,9 +67,15 @@ fn duplicates_by() { let xs = ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"]; let ys = ["aa", "bbbb", "cccc"]; it::assert_equal(ys.iter(), xs.iter().duplicates_by(|x| x[..2].to_string())); - it::assert_equal(ys.iter(), xs.iter().rev().duplicates_by(|x| x[..2].to_string()).rev()); + it::assert_equal( + ys.iter(), + xs.iter().rev().duplicates_by(|x| x[..2].to_string()).rev(), + ); let ys_rev = ["ccc", "aa", "bbbbb"]; - it::assert_equal(ys_rev.iter(), xs.iter().duplicates_by(|x| x[..2].to_string()).rev()); + it::assert_equal( + ys_rev.iter(), + xs.iter().duplicates_by(|x| x[..2].to_string()).rev(), + ); } #[test] @@ -83,10 +94,13 @@ fn duplicates() { let ys_rev = [1, 0]; it::assert_equal(ys_rev.iter(), xs.iter().duplicates().rev()); - let xs = vec![0, 1, 2, 1, 2]; + let xs = [0, 1, 2, 1, 2]; let ys = vec![1, 2]; assert_eq!(ys, xs.iter().duplicates().cloned().collect_vec()); - assert_eq!(ys, xs.iter().rev().duplicates().rev().cloned().collect_vec()); + assert_eq!( + ys, + xs.iter().rev().duplicates().rev().cloned().collect_vec() + ); let ys_rev = vec![2, 1]; assert_eq!(ys_rev, xs.iter().duplicates().rev().cloned().collect_vec()); } @@ -96,9 +110,15 @@ fn unique_by() { let xs = ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"]; let ys = ["aaa", "bbbbb", "ccc"]; it::assert_equal(ys.iter(), xs.iter().unique_by(|x| x[..2].to_string())); - it::assert_equal(ys.iter(), xs.iter().rev().unique_by(|x| x[..2].to_string()).rev()); + it::assert_equal( + ys.iter(), + xs.iter().rev().unique_by(|x| x[..2].to_string()).rev(), + ); let ys_rev = ["cccc", "aaaaa", "bbbb"]; - it::assert_equal(ys_rev.iter(), xs.iter().unique_by(|x| x[..2].to_string()).rev()); + it::assert_equal( + ys_rev.iter(), + xs.iter().unique_by(|x| x[..2].to_string()).rev(), + ); } #[test] @@ -127,7 +147,7 @@ fn intersperse() { let ys = [0, 1, 2, 3]; let mut it = ys[..0].iter().copied().intersperse(1); - assert!(it.next() == None); + assert!(it.next().is_none()); } #[test] @@ -148,14 +168,14 @@ fn dedup() { #[test] fn coalesce() { - let data = vec![-1., -2., -3., 3., 1., 0., -1.]; - let it = data.iter().cloned().coalesce(|x, y| + let data = [-1., -2., -3., 3., 1., 0., -1.]; + let it = data.iter().cloned().coalesce(|x, y| { if (x >= 0.) == (y >= 0.) { Ok(x + y) } else { Err((x, y)) } - ); + }); itertools::assert_equal(it.clone(), vec![-6., 4., -1.]); assert_eq!( it.fold(vec![], |mut v, n| { @@ -168,17 +188,37 @@ fn coalesce() { #[test] fn dedup_by() { - let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; + let xs = [ + (0, 0), + (0, 1), + (1, 1), + (2, 1), + (0, 2), + (3, 1), + (0, 3), + (1, 3), + ]; let ys = [(0, 0), (0, 1), (0, 2), (3, 1), (0, 3)]; - it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.1==y.1)); + it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.1 == y.1)); let xs = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]; let ys = [(0, 1)]; - it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.0==y.0)); + it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.0 == y.0)); - let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; + let xs = [ + (0, 0), + (0, 1), + (1, 1), + (2, 1), + (0, 2), + (3, 1), + (0, 3), + (1, 3), + ]; let ys = [(0, 0), (0, 1), (0, 2), (3, 1), (0, 3)]; let mut xs_d = Vec::new(); - xs.iter().dedup_by(|x, y| x.1==y.1).fold((), |(), &elt| xs_d.push(elt)); + xs.iter() + .dedup_by(|x, y| x.1 == y.1) + .fold((), |(), &elt| xs_d.push(elt)); assert_eq!(&xs_d, &ys); } @@ -195,18 +235,38 @@ fn dedup_with_count() { it::assert_equal(ys.iter().cloned(), xs.iter().dedup_with_count()); } - #[test] fn dedup_by_with_count() { - let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; - let ys = [(1, &(0, 0)), (3, &(0, 1)), (1, &(0, 2)), (1, &(3, 1)), (2, &(0, 3))]; + let xs = [ + (0, 0), + (0, 1), + (1, 1), + (2, 1), + (0, 2), + (3, 1), + (0, 3), + (1, 3), + ]; + let ys = [ + (1, &(0, 0)), + (3, &(0, 1)), + (1, &(0, 2)), + (1, &(3, 1)), + (2, &(0, 3)), + ]; - it::assert_equal(ys.iter().cloned(), xs.iter().dedup_by_with_count(|x, y| x.1==y.1)); + it::assert_equal( + ys.iter().cloned(), + xs.iter().dedup_by_with_count(|x, y| x.1 == y.1), + ); let xs = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]; - let ys = [( 5, &(0, 1))]; + let ys = [(5, &(0, 1))]; - it::assert_equal(ys.iter().cloned(), xs.iter().dedup_by_with_count(|x, y| x.0==y.0)); + it::assert_equal( + ys.iter().cloned(), + xs.iter().dedup_by_with_count(|x, y| x.0 == y.0), + ); } #[test] @@ -215,11 +275,27 @@ fn all_equal() { assert!("A".chars().all_equal()); assert!(!"AABBCCC".chars().all_equal()); assert!("AAAAAAA".chars().all_equal()); - for (_key, mut sub) in &"AABBCCC".chars().group_by(|&x| x) { + for (_key, mut sub) in &"AABBCCC".chars().chunk_by(|&x| x) { assert!(sub.all_equal()); } } +#[test] +fn all_equal_value() { + assert_eq!("".chars().all_equal_value(), Err(None)); + assert_eq!("A".chars().all_equal_value(), Ok('A')); + assert_eq!("AABBCCC".chars().all_equal_value(), Err(Some(('A', 'B')))); + assert_eq!("AAAAAAA".chars().all_equal_value(), Ok('A')); + { + let mut it = [1, 2, 3].iter().copied(); + let result = it.all_equal_value(); + assert_eq!(result, Err(Some((1, 2)))); + let remaining = it.next(); + assert_eq!(remaining, Some(3)); + assert!(it.next().is_none()); + } +} + #[test] fn all_unique() { assert!("ABCDEFGH".chars().all_unique()); @@ -240,7 +316,7 @@ fn test_put_back_n() { #[test] fn tee() { - let xs = [0, 1, 2, 3]; + let xs = [0, 1, 2, 3]; let (mut t1, mut t2) = xs.iter().cloned().tee(); assert_eq!(t1.next(), Some(0)); assert_eq!(t2.next(), Some(0)); @@ -264,7 +340,6 @@ fn tee() { it::assert_equal(t1.zip(t2), xs.iter().cloned().zip(xs.iter().cloned())); } - #[test] fn test_rciter() { let xs = [0, 1, 1, 1, 2, 1, 3, 5, 6]; @@ -285,26 +360,24 @@ fn test_rciter() { assert_eq!(z.next(), Some((0, 1))); } -#[allow(deprecated)] #[test] fn trait_pointers() { - struct ByRef<'r, I: ?Sized>(&'r mut I) ; + struct ByRef<'r, I: ?Sized>(&'r mut I); - impl<'r, X, I: ?Sized> Iterator for ByRef<'r, I> where - I: 'r + Iterator + impl<'r, X, I> Iterator for ByRef<'r, I> + where + I: ?Sized + 'r + Iterator, { type Item = X; - fn next(&mut self) -> Option - { + fn next(&mut self) -> Option { self.0.next() } } - let mut it = Box::new(0..10) as Box>; + let mut it = Box::new(0..10) as Box>; assert_eq!(it.next(), Some(0)); { - /* make sure foreach works on non-Sized */ let jt: &mut dyn Iterator = &mut *it; assert_eq!(jt.next(), Some(1)); @@ -314,15 +387,22 @@ fn trait_pointers() { } assert_eq!(jt.find_position(|x| *x == 4), Some((1, 4))); - jt.foreach(|_| ()); + jt.for_each(|_| ()); } } #[test] fn merge_by() { - let odd : Vec<(u32, &str)> = vec![(1, "hello"), (3, "world"), (5, "!")]; - let even = vec![(2, "foo"), (4, "bar"), (6, "baz")]; - let expected = vec![(1, "hello"), (2, "foo"), (3, "world"), (4, "bar"), (5, "!"), (6, "baz")]; + let odd: Vec<(u32, &str)> = vec![(1, "hello"), (3, "world"), (5, "!")]; + let even = [(2, "foo"), (4, "bar"), (6, "baz")]; + let expected = [ + (1, "hello"), + (2, "foo"), + (3, "world"), + (4, "bar"), + (5, "!"), + (6, "baz"), + ]; let results = odd.iter().merge_by(even.iter(), |a, b| a.0 <= b.0); it::assert_equal(results, expected.iter()); } @@ -336,23 +416,21 @@ fn merge_by_btree() { let mut bt2 = BTreeMap::new(); bt2.insert("foo", 2); bt2.insert("bar", 4); - let results = bt1.into_iter().merge_by(bt2.into_iter(), |a, b| a.0 <= b.0 ); + let results = bt1.into_iter().merge_by(bt2, |a, b| a.0 <= b.0); let expected = vec![("bar", 4), ("foo", 2), ("hello", 1), ("world", 3)]; - it::assert_equal(results, expected.into_iter()); + it::assert_equal(results, expected); } -#[allow(deprecated)] #[test] fn kmerge() { - let its = (0..4).map(|s| (s..10).step(4)); + let its = (0..4).map(|s| (s..10).step_by(4)); it::assert_equal(its.kmerge(), 0..10); } -#[allow(deprecated)] #[test] fn kmerge_2() { - let its = vec![3, 2, 1, 0].into_iter().map(|s| (s..10).step(4)); + let its = vec![3, 2, 1, 0].into_iter().map(|s| (s..10).step_by(4)); it::assert_equal(its.kmerge(), 0..10); } @@ -378,19 +456,17 @@ fn kmerge_empty_size_hint() { #[test] fn join() { let many = [1, 2, 3]; - let one = [1]; + let one = [1]; let none: Vec = vec![]; assert_eq!(many.iter().join(", "), "1, 2, 3"); - assert_eq!( one.iter().join(", "), "1"); + assert_eq!(one.iter().join(", "), "1"); assert_eq!(none.iter().join(", "), ""); } #[test] fn sorted_unstable_by() { - let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| { - a.cmp(&b) - }); + let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| a.cmp(&b)); it::assert_equal(sc, vec![1, 2, 3, 4]); let v = (0..5).sorted_unstable_by(|&a, &b| a.cmp(&b).reverse()); @@ -408,33 +484,85 @@ fn sorted_unstable_by_key() { #[test] fn sorted_by() { - let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| { - a.cmp(&b) - }); + let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| a.cmp(&b)); it::assert_equal(sc, vec![1, 2, 3, 4]); let v = (0..5).sorted_by(|&a, &b| a.cmp(&b).reverse()); it::assert_equal(v, vec![4, 3, 2, 1, 0]); } +#[cfg(not(miri))] qc::quickcheck! { - fn k_smallest_range(n: u64, m: u16, k: u16) -> () { + fn k_smallest_range(n: i64, m: u16, k: u16) -> () { // u16 is used to constrain k and m to 0..2¹⁶, // otherwise the test could use too much memory. - let (k, m) = (k as u64, m as u64); + let (k, m) = (k as usize, m as u64); + let mut v: Vec<_> = (n..n.saturating_add(m as _)).collect(); // Generate a random permutation of n..n+m - let i = { - let mut v: Vec = (n..n.saturating_add(m)).collect(); - v.shuffle(&mut thread_rng()); - v.into_iter() - }; + v.shuffle(&mut thread_rng()); - // Check that taking the k smallest elements yields n..n+min(k, m) - it::assert_equal( - i.k_smallest(k as usize), - n..n.saturating_add(min(k, m)) - ); + // Construct the right answers for the top and bottom elements + let mut sorted = v.clone(); + sorted.sort(); + // how many elements are we checking + let num_elements = min(k, m as _); + + // Compute the top and bottom k in various combinations + let sorted_smallest = sorted[..num_elements].iter().cloned(); + let smallest = v.iter().cloned().k_smallest(k); + let smallest_by = v.iter().cloned().k_smallest_by(k, Ord::cmp); + let smallest_by_key = v.iter().cloned().k_smallest_by_key(k, |&x| x); + + let sorted_largest = sorted[sorted.len() - num_elements..].iter().rev().cloned(); + let largest = v.iter().cloned().k_largest(k); + let largest_by = v.iter().cloned().k_largest_by(k, Ord::cmp); + let largest_by_key = v.iter().cloned().k_largest_by_key(k, |&x| x); + + // Check the variations produce the same answers and that they're right + it::assert_equal(smallest, sorted_smallest.clone()); + it::assert_equal(smallest_by, sorted_smallest.clone()); + it::assert_equal(smallest_by_key, sorted_smallest); + + it::assert_equal(largest, sorted_largest.clone()); + it::assert_equal(largest_by, sorted_largest.clone()); + it::assert_equal(largest_by_key, sorted_largest); + } + + fn k_smallest_relaxed_range(n: i64, m: u16, k: u16) -> () { + // u16 is used to constrain k and m to 0..2¹⁶, + // otherwise the test could use too much memory. + let (k, m) = (k as usize, m as u64); + + let mut v: Vec<_> = (n..n.saturating_add(m as _)).collect(); + // Generate a random permutation of n..n+m + v.shuffle(&mut thread_rng()); + + // Construct the right answers for the top and bottom elements + let mut sorted = v.clone(); + sorted.sort(); + // how many elements are we checking + let num_elements = min(k, m as _); + + // Compute the top and bottom k in various combinations + let sorted_smallest = sorted[..num_elements].iter().cloned(); + let smallest = v.iter().cloned().k_smallest_relaxed(k); + let smallest_by = v.iter().cloned().k_smallest_relaxed_by(k, Ord::cmp); + let smallest_by_key = v.iter().cloned().k_smallest_relaxed_by_key(k, |&x| x); + + let sorted_largest = sorted[sorted.len() - num_elements..].iter().rev().cloned(); + let largest = v.iter().cloned().k_largest_relaxed(k); + let largest_by = v.iter().cloned().k_largest_relaxed_by(k, Ord::cmp); + let largest_by_key = v.iter().cloned().k_largest_relaxed_by_key(k, |&x| x); + + // Check the variations produce the same answers and that they're right + it::assert_equal(smallest, sorted_smallest.clone()); + it::assert_equal(smallest_by, sorted_smallest.clone()); + it::assert_equal(smallest_by_key, sorted_smallest); + + it::assert_equal(largest, sorted_largest.clone()); + it::assert_equal(largest_by, sorted_largest.clone()); + it::assert_equal(largest_by_key, sorted_largest); } } @@ -443,11 +571,13 @@ struct RandIter + _t: PhantomData, } impl Iterator for RandIter -where Standard: Distribution { +where + Standard: Distribution, +{ type Item = T; fn next(&mut self) -> Option { if self.idx == self.len { @@ -461,11 +591,11 @@ where Standard: Distribution { impl qc::Arbitrary for RandIter { fn arbitrary(g: &mut G) -> Self { - RandIter { + Self { idx: 0, len: g.size(), rng: R::seed_from_u64(g.next_u64()), - _t : PhantomData{}, + _t: PhantomData {}, } } } @@ -478,11 +608,25 @@ where I::Item: Ord + Debug, { let j = i.clone(); + let i1 = i.clone(); + let j1 = i.clone(); let k = k as usize; - it::assert_equal( - i.k_smallest(k), - j.sorted().take(k) - ) + it::assert_equal(i.k_smallest(k), j.sorted().take(k)); + it::assert_equal(i1.k_smallest_relaxed(k), j1.sorted().take(k)); +} + +// Similar to `k_smallest_sort` but for our custom heap implementation. +fn k_smallest_by_sort(i: I, k: u16) +where + I: Iterator + Clone, + I::Item: Ord + Debug, +{ + let j = i.clone(); + let i1 = i.clone(); + let j1 = i.clone(); + let k = k as usize; + it::assert_equal(i.k_smallest_by(k, Ord::cmp), j.sorted().take(k)); + it::assert_equal(i1.k_smallest_relaxed_by(k, Ord::cmp), j1.sorted().take(k)); } macro_rules! generic_test { @@ -497,7 +641,10 @@ macro_rules! generic_test { }; } +#[cfg(not(miri))] generic_test!(k_smallest_sort, u8, u16, u32, u64, i8, i16, i32, i64); +#[cfg(not(miri))] +generic_test!(k_smallest_by_sort, u8, u16, u32, u64, i8, i16, i32, i64); #[test] fn sorted_by_key() { @@ -534,7 +681,7 @@ fn sorted_by_cached_key() { #[test] fn test_multipeek() { - let nums = vec![1u8,2,3,4,5]; + let nums = vec![1u8, 2, 3, 4, 5]; let mp = multipeek(nums.iter().copied()); assert_eq!(nums, mp.collect::>()); @@ -575,7 +722,7 @@ fn test_multipeek_reset() { #[test] fn test_multipeek_peeking_next() { use crate::it::PeekingNext; - let nums = vec![1u8,2,3,4,5,6,7]; + let nums = [1u8, 2, 3, 4, 5, 6, 7]; let mut mp = multipeek(nums.iter().copied()); assert_eq!(mp.peeking_next(|&x| x != 0), Some(1)); @@ -598,9 +745,24 @@ fn test_multipeek_peeking_next() { assert_eq!(mp.peek(), None); } +#[test] +fn test_repeat_n_peeking_next() { + use crate::it::PeekingNext; + let mut rn = repeat_n(0, 5); + assert_eq!(rn.peeking_next(|&x| x != 0), None); + assert_eq!(rn.peeking_next(|&x| x <= 0), Some(0)); + assert_eq!(rn.next(), Some(0)); + assert_eq!(rn.peeking_next(|&x| x <= 0), Some(0)); + assert_eq!(rn.peeking_next(|&x| x != 0), None); + assert_eq!(rn.peeking_next(|&x| x >= 0), Some(0)); + assert_eq!(rn.next(), Some(0)); + assert_eq!(rn.peeking_next(|&x| x <= 0), None); + assert_eq!(rn.next(), None); +} + #[test] fn test_peek_nth() { - let nums = vec![1u8,2,3,4,5]; + let nums = vec![1u8, 2, 3, 4, 5]; let iter = peek_nth(nums.iter().copied()); assert_eq!(nums, iter.collect::>()); @@ -635,7 +797,7 @@ fn test_peek_nth() { #[test] fn test_peek_nth_peeking_next() { use it::PeekingNext; - let nums = vec![1u8,2,3,4,5,6,7]; + let nums = [1u8, 2, 3, 4, 5, 6, 7]; let mut iter = peek_nth(nums.iter().copied()); assert_eq!(iter.peeking_next(|&x| x != 0), Some(1)); @@ -662,6 +824,35 @@ fn test_peek_nth_peeking_next() { assert_eq!(iter.peek(), None); } +#[test] +fn test_peek_nth_next_if() { + let nums = [1u8, 2, 3, 4, 5, 6, 7]; + let mut iter = peek_nth(nums.iter().copied()); + + assert_eq!(iter.next_if(|&x| x != 0), Some(1)); + assert_eq!(iter.next(), Some(2)); + + assert_eq!(iter.peek_nth(0), Some(&3)); + assert_eq!(iter.peek_nth(1), Some(&4)); + assert_eq!(iter.next_if_eq(&3), Some(3)); + assert_eq!(iter.peek(), Some(&4)); + + assert_eq!(iter.next_if(|&x| x != 4), None); + assert_eq!(iter.next_if_eq(&4), Some(4)); + assert_eq!(iter.peek_nth(0), Some(&5)); + assert_eq!(iter.peek_nth(1), Some(&6)); + + assert_eq!(iter.next_if(|&x| x != 5), None); + assert_eq!(iter.peek(), Some(&5)); + + assert_eq!(iter.next_if(|&x| x % 2 == 1), Some(5)); + assert_eq!(iter.next_if_eq(&6), Some(6)); + assert_eq!(iter.peek_nth(0), Some(&7)); + assert_eq!(iter.peek_nth(1), None); + assert_eq!(iter.next(), Some(7)); + assert_eq!(iter.peek(), None); +} + #[test] fn pad_using() { it::assert_equal((0..0).pad_using(1, |_| 1), 1..2); @@ -676,14 +867,14 @@ fn pad_using() { } #[test] -fn group_by() { - for (ch1, sub) in &"AABBCCC".chars().group_by(|&x| x) { +fn chunk_by() { + for (ch1, sub) in &"AABBCCC".chars().chunk_by(|&x| x) { for ch2 in sub { assert_eq!(ch1, ch2); } } - for (ch1, sub) in &"AAABBBCCCCDDDD".chars().group_by(|&x| x) { + for (ch1, sub) in &"AAABBBCCCCDDDD".chars().chunk_by(|&x| x) { for ch2 in sub { assert_eq!(ch1, ch2); if ch1 == 'C' { @@ -696,24 +887,24 @@ fn group_by() { // try all possible orderings for indices in permutohedron::Heap::new(&mut [0, 1, 2, 3]) { - let groups = "AaaBbbccCcDDDD".chars().group_by(&toupper); - let mut subs = groups.into_iter().collect_vec(); + let chunks = "AaaBbbccCcDDDD".chars().chunk_by(&toupper); + let mut subs = chunks.into_iter().collect_vec(); for &idx in &indices[..] { let (key, text) = match idx { - 0 => ('A', "Aaa".chars()), - 1 => ('B', "Bbb".chars()), - 2 => ('C', "ccCc".chars()), - 3 => ('D', "DDDD".chars()), - _ => unreachable!(), + 0 => ('A', "Aaa".chars()), + 1 => ('B', "Bbb".chars()), + 2 => ('C', "ccCc".chars()), + 3 => ('D', "DDDD".chars()), + _ => unreachable!(), }; assert_eq!(key, subs[idx].0); it::assert_equal(&mut subs[idx].1, text); } } - let groups = "AAABBBCCCCDDDD".chars().group_by(|&x| x); - let mut subs = groups.into_iter().map(|(_, g)| g).collect_vec(); + let chunks = "AAABBBCCCCDDDD".chars().chunk_by(|&x| x); + let mut subs = chunks.into_iter().map(|(_, g)| g).collect_vec(); let sd = subs.pop().unwrap(); let sc = subs.pop().unwrap(); @@ -730,9 +921,11 @@ fn group_by() { { let mut ntimes = 0; let text = "AABCCC"; - for (_, sub) in &text.chars().group_by(|&x| { ntimes += 1; x}) { - for _ in sub { - } + for (_, sub) in &text.chars().chunk_by(|&x| { + ntimes += 1; + x + }) { + for _ in sub {} } assert_eq!(ntimes, text.len()); } @@ -740,91 +933,95 @@ fn group_by() { { let mut ntimes = 0; let text = "AABCCC"; - for _ in &text.chars().group_by(|&x| { ntimes += 1; x}) { - } + for _ in &text.chars().chunk_by(|&x| { + ntimes += 1; + x + }) {} assert_eq!(ntimes, text.len()); } { let text = "ABCCCDEEFGHIJJKK"; - let gr = text.chars().group_by(|&x| x); + let gr = text.chars().chunk_by(|&x| x); it::assert_equal(gr.into_iter().flat_map(|(_, sub)| sub), text.chars()); } } #[test] -fn group_by_lazy_2() { - let data = vec![0, 1]; - let groups = data.iter().group_by(|k| *k); - let gs = groups.into_iter().collect_vec(); +fn chunk_by_lazy_2() { + let data = [0, 1]; + let chunks = data.iter().chunk_by(|k| *k); + let gs = chunks.into_iter().collect_vec(); it::assert_equal(data.iter(), gs.into_iter().flat_map(|(_k, g)| g)); - let data = vec![0, 1, 1, 0, 0]; - let groups = data.iter().group_by(|k| *k); - let mut gs = groups.into_iter().collect_vec(); + let data = [0, 1, 1, 0, 0]; + let chunks = data.iter().chunk_by(|k| *k); + let mut gs = chunks.into_iter().collect_vec(); gs[1..].reverse(); it::assert_equal(&[0, 0, 0, 1, 1], gs.into_iter().flat_map(|(_, g)| g)); - let grouper = data.iter().group_by(|k| *k); - let mut groups = Vec::new(); - for (k, group) in &grouper { + let grouper = data.iter().chunk_by(|k| *k); + let mut chunks = Vec::new(); + for (k, chunk) in &grouper { if *k == 1 { - groups.push(group); + chunks.push(chunk); } } - it::assert_equal(&mut groups[0], &[1, 1]); + it::assert_equal(&mut chunks[0], &[1, 1]); - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; - let grouper = data.iter().group_by(|k| *k); - let mut groups = Vec::new(); - for (i, (_, group)) in grouper.into_iter().enumerate() { + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let grouper = data.iter().chunk_by(|k| *k); + let mut chunks = Vec::new(); + for (i, (_, chunk)) in grouper.into_iter().enumerate() { if i < 2 { - groups.push(group); + chunks.push(chunk); } else if i < 4 { - for _ in group { - } + for _ in chunk {} } else { - groups.push(group); + chunks.push(chunk); } } - it::assert_equal(&mut groups[0], &[0, 0, 0]); - it::assert_equal(&mut groups[1], &[1, 1]); - it::assert_equal(&mut groups[2], &[3, 3]); + it::assert_equal(&mut chunks[0], &[0, 0, 0]); + it::assert_equal(&mut chunks[1], &[1, 1]); + it::assert_equal(&mut chunks[2], &[3, 3]); - // use groups as chunks - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let mut i = 0; - let grouper = data.iter().group_by(move |_| { let k = i / 3; i += 1; k }); - for (i, group) in &grouper { + let grouper = data.iter().chunk_by(move |_| { + let k = i / 3; + i += 1; + k + }); + for (i, chunk) in &grouper { match i { - 0 => it::assert_equal(group, &[0, 0, 0]), - 1 => it::assert_equal(group, &[1, 1, 0]), - 2 => it::assert_equal(group, &[0, 2, 2]), - 3 => it::assert_equal(group, &[3, 3]), + 0 => it::assert_equal(chunk, &[0, 0, 0]), + 1 => it::assert_equal(chunk, &[1, 1, 0]), + 2 => it::assert_equal(chunk, &[0, 2, 2]), + 3 => it::assert_equal(chunk, &[3, 3]), _ => unreachable!(), } } } #[test] -fn group_by_lazy_3() { - // test consuming each group on the lap after it was produced - let data = vec![0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2]; - let grouper = data.iter().group_by(|elt| *elt); +fn chunk_by_lazy_3() { + // test consuming each chunk on the lap after it was produced + let data = [0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2]; + let grouper = data.iter().chunk_by(|elt| *elt); let mut last = None; - for (key, group) in &grouper { + for (key, chunk) in &grouper { if let Some(gr) = last.take() { for elt in gr { assert!(elt != key && i32::abs(elt - key) == 1); } } - last = Some(group); + last = Some(chunk); } } #[test] fn chunks() { - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let grouper = data.iter().chunks(3); for (i, chunk) in grouper.into_iter().enumerate() { match i { @@ -845,8 +1042,8 @@ fn concat_empty() { #[test] fn concat_non_empty() { - let data = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]]; - assert_eq!(data.into_iter().concat(), vec![1,2,3,4,5,6,7,8,9]) + let data = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]; + assert_eq!(data.into_iter().concat(), vec![1, 2, 3, 4, 5, 6, 7, 8, 9]) } #[test] @@ -854,19 +1051,20 @@ fn combinations() { assert!((1..3).combinations(5).next().is_none()); let it = (1..3).combinations(2); - it::assert_equal(it, vec![ - vec![1, 2], - ]); + it::assert_equal(it, vec![vec![1, 2]]); let it = (1..5).combinations(2); - it::assert_equal(it, vec![ - vec![1, 2], - vec![1, 3], - vec![1, 4], - vec![2, 3], - vec![2, 4], - vec![3, 4], - ]); + it::assert_equal( + it, + vec![ + vec![1, 2], + vec![1, 3], + vec![1, 4], + vec![2, 3], + vec![2, 4], + vec![3, 4], + ], + ); it::assert_equal((0..0).tuple_combinations::<(_, _)>(), >::new()); it::assert_equal((0..1).tuple_combinations::<(_, _)>(), >::new()); @@ -886,13 +1084,88 @@ fn combinations_of_too_short() { } } - #[test] fn combinations_zero() { it::assert_equal((1..3).combinations(0), vec![vec![]]); it::assert_equal((0..0).combinations(0), vec![vec![]]); } +fn binomial(n: usize, k: usize) -> usize { + if k > n { + 0 + } else { + (n - k + 1..=n).product::() / (1..=k).product::() + } +} + +#[test] +fn combinations_range_count() { + for n in 0..=7 { + for k in 0..=7 { + let len = binomial(n, k); + let mut it = (0..n).combinations(k); + assert_eq!(len, it.clone().count()); + assert_eq!(len, it.size_hint().0); + assert_eq!(Some(len), it.size_hint().1); + for count in (0..len).rev() { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(count, it.clone().count()); + assert_eq!(count, it.size_hint().0); + assert_eq!(Some(count), it.size_hint().1); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } + } +} + +#[test] +fn combinations_inexact_size_hints() { + for k in 0..=7 { + let mut numbers = (0..18).filter(|i| i % 2 == 0); // 9 elements + let mut it = numbers.clone().combinations(k); + let real_n = numbers.clone().count(); + let len = binomial(real_n, k); + assert_eq!(len, it.clone().count()); + + let mut nb_loaded = 0; + let sh = numbers.size_hint(); + assert_eq!(binomial(sh.0 + nb_loaded, k), it.size_hint().0); + assert_eq!(sh.1.map(|n| binomial(n + nb_loaded, k)), it.size_hint().1); + + for next_count in 1..=len { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(len - next_count, it.clone().count()); + if next_count == 1 { + // The very first time, the lazy buffer is prefilled. + nb_loaded = numbers.by_ref().take(k).count(); + } else { + // Then it loads one item each time until exhausted. + let nb = numbers.next(); + if nb.is_some() { + nb_loaded += 1; + } + } + let sh = numbers.size_hint(); + if next_count > real_n - k + 1 { + assert_eq!(0, sh.0); + assert_eq!(Some(0), sh.1); + assert_eq!(real_n, nb_loaded); + // Once it's fully loaded, size hints of `it` are exacts. + } + assert_eq!(binomial(sh.0 + nb_loaded, k) - next_count, it.size_hint().0); + assert_eq!( + sh.1.map(|n| binomial(n + nb_loaded, k) - next_count), + it.size_hint().1 + ); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } +} + #[test] fn permutations_zero() { it::assert_equal((1..3).permutations(0), vec![vec![]]); @@ -900,6 +1173,41 @@ fn permutations_zero() { } #[test] +fn permutations_range_count() { + for n in 0..=4 { + for k in 0..=4 { + let len = if k <= n { (n - k + 1..=n).product() } else { 0 }; + let mut it = (0..n).permutations(k); + assert_eq!(len, it.clone().count()); + assert_eq!(len, it.size_hint().0); + assert_eq!(Some(len), it.size_hint().1); + for count in (0..len).rev() { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(count, it.clone().count()); + assert_eq!(count, it.size_hint().0); + assert_eq!(Some(count), it.size_hint().1); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } + } +} + +#[test] +fn permutations_overflowed_size_hints() { + let mut it = std::iter::repeat(()).permutations(2); + assert_eq!(it.size_hint().0, usize::MAX); + assert_eq!(it.size_hint().1, None); + for nb_generated in 1..=1000 { + it.next(); + assert!(it.size_hint().0 >= usize::MAX - nb_generated); + assert_eq!(it.size_hint().1, None); + } +} + +#[test] +#[cfg(not(miri))] fn combinations_with_replacement() { // Pool smaller than n it::assert_equal((0..1).combinations_with_replacement(2), vec![vec![0, 0]]); @@ -916,15 +1224,9 @@ fn combinations_with_replacement() { ], ); // Zero size - it::assert_equal( - (0..3).combinations_with_replacement(0), - vec![vec![]], - ); + it::assert_equal((0..3).combinations_with_replacement(0), vec![vec![]]); // Zero size on empty pool - it::assert_equal( - (0..0).combinations_with_replacement(0), - vec![vec![]], - ); + it::assert_equal((0..0).combinations_with_replacement(0), vec![vec![]]); // Empty pool it::assert_equal( (0..0).combinations_with_replacement(2), @@ -932,26 +1234,75 @@ fn combinations_with_replacement() { ); } +#[test] +fn combinations_with_replacement_range_count() { + for n in 0..=4 { + for k in 0..=4 { + let len = binomial(usize::saturating_sub(n + k, 1), k); + let mut it = (0..n).combinations_with_replacement(k); + assert_eq!(len, it.clone().count()); + assert_eq!(len, it.size_hint().0); + assert_eq!(Some(len), it.size_hint().1); + for count in (0..len).rev() { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(count, it.clone().count()); + assert_eq!(count, it.size_hint().0); + assert_eq!(Some(count), it.size_hint().1); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } + } +} + #[test] fn powerset() { it::assert_equal((0..0).powerset(), vec![vec![]]); it::assert_equal((0..1).powerset(), vec![vec![], vec![0]]); - it::assert_equal((0..2).powerset(), vec![vec![], vec![0], vec![1], vec![0, 1]]); - it::assert_equal((0..3).powerset(), vec![ - vec![], - vec![0], vec![1], vec![2], - vec![0, 1], vec![0, 2], vec![1, 2], - vec![0, 1, 2] - ]); + it::assert_equal( + (0..2).powerset(), + vec![vec![], vec![0], vec![1], vec![0, 1]], + ); + it::assert_equal( + (0..3).powerset(), + vec![ + vec![], + vec![0], + vec![1], + vec![2], + vec![0, 1], + vec![0, 2], + vec![1, 2], + vec![0, 1, 2], + ], + ); assert_eq!((0..4).powerset().count(), 1 << 4); assert_eq!((0..8).powerset().count(), 1 << 8); assert_eq!((0..16).powerset().count(), 1 << 16); + + for n in 0..=4 { + let mut it = (0..n).powerset(); + let len = 2_usize.pow(n); + assert_eq!(len, it.clone().count()); + assert_eq!(len, it.size_hint().0); + assert_eq!(Some(len), it.size_hint().1); + for count in (0..len).rev() { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(count, it.clone().count()); + assert_eq!(count, it.size_hint().0); + assert_eq!(Some(count), it.size_hint().1); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } } #[test] fn diff_mismatch() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 5.0, 3.0, 4.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); @@ -965,21 +1316,20 @@ fn diff_mismatch() { #[test] fn diff_longer() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); assert!(match diff { - Some(it::Diff::Longer(_, remaining)) => - remaining.collect::>() == vec![5, 6], + Some(it::Diff::Longer(_, remaining)) => remaining.collect::>() == vec![5, 6], _ => false, }); } #[test] fn diff_shorter() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 2.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); @@ -999,14 +1349,14 @@ fn extrema_set() { #[derive(Clone, Debug, PartialEq, Eq)] struct Val(u32, u32); - impl PartialOrd for Val { - fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) + impl PartialOrd for Val { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) } } impl Ord for Val { - fn cmp(&self, other: &Val) -> Ordering { + fn cmp(&self, other: &Self) -> Ordering { self.0.cmp(&other.0) } } @@ -1017,7 +1367,7 @@ fn extrema_set() { assert_eq!(Some(1u32).iter().min_set(), vec![&1]); assert_eq!(Some(1u32).iter().max_set(), vec![&1]); - let data = vec![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; + let data = [Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; let min_set = data.iter().min_set(); assert_eq!(min_set, vec![&Val(0, 1), &Val(0, 2)]); @@ -1040,31 +1390,34 @@ fn extrema_set() { #[test] fn minmax() { - use std::cmp::Ordering; use crate::it::MinMaxResult; + use std::cmp::Ordering; // A peculiar type: Equality compares both tuple items, but ordering only the // first item. This is so we can check the stability property easily. #[derive(Clone, Debug, PartialEq, Eq)] struct Val(u32, u32); - impl PartialOrd for Val { - fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) + impl PartialOrd for Val { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) } } impl Ord for Val { - fn cmp(&self, other: &Val) -> Ordering { + fn cmp(&self, other: &Self) -> Ordering { self.0.cmp(&other.0) } } - assert_eq!(None::>.iter().minmax(), MinMaxResult::NoElements); + assert_eq!( + None::>.iter().minmax(), + MinMaxResult::NoElements + ); assert_eq!(Some(1u32).iter().minmax(), MinMaxResult::OneElement(&1)); - let data = vec![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; + let data = [Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; let minmax = data.iter().minmax(); assert_eq!(minmax, MinMaxResult::MinMax(&Val(0, 1), &Val(2, 1))); @@ -1073,7 +1426,11 @@ fn minmax() { assert_eq!(min, &Val(2, 0)); assert_eq!(max, &Val(0, 2)); - let (min, max) = data.iter().minmax_by(|x, y| x.1.cmp(&y.1)).into_option().unwrap(); + let (min, max) = data + .iter() + .minmax_by(|x, y| x.1.cmp(&y.1)) + .into_option() + .unwrap(); assert_eq!(min, &Val(2, 0)); assert_eq!(max, &Val(0, 2)); } @@ -1096,31 +1453,34 @@ fn format() { #[test] fn while_some() { - let ns = (1..10).map(|x| if x % 5 != 0 { Some(x) } else { None }) - .while_some(); + let ns = (1..10) + .map(|x| if x % 5 != 0 { Some(x) } else { None }) + .while_some(); it::assert_equal(ns, vec![1, 2, 3, 4]); } -#[allow(deprecated)] #[test] fn fold_while() { let mut iterations = 0; let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - let sum = vec.into_iter().fold_while(0, |acc, item| { - iterations += 1; - let new_sum = acc + item; - if new_sum <= 20 { - FoldWhile::Continue(new_sum) - } else { - FoldWhile::Done(acc) - } - }).into_inner(); + let sum = vec + .into_iter() + .fold_while(0, |acc, item| { + iterations += 1; + let new_sum = acc + item; + if new_sum <= 20 { + FoldWhile::Continue(new_sum) + } else { + FoldWhile::Done(acc) + } + }) + .into_inner(); assert_eq!(iterations, 6); assert_eq!(sum, 15); } #[test] -fn tree_fold1() { +fn tree_reduce() { let x = [ "", "0", @@ -1141,9 +1501,13 @@ fn tree_fold1() { "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x 14 15 x x x x", ]; for (i, &s) in x.iter().enumerate() { - let expected = if s.is_empty() { None } else { Some(s.to_string()) }; + let expected = if s.is_empty() { + None + } else { + Some(s.to_string()) + }; let num_strings = (0..i).map(|x| x.to_string()); - let actual = num_strings.tree_fold1(|a, b| format!("{} {} x", a, b)); + let actual = num_strings.tree_reduce(|a, b| format!("{} {} x", a, b)); assert_eq!(actual, expected); } } @@ -1153,16 +1517,53 @@ fn exactly_one_question_mark_syntax_works() { exactly_one_question_mark_return().unwrap_err(); } -fn exactly_one_question_mark_return() -> Result<(), ExactlyOneError>> { +fn exactly_one_question_mark_return() -> Result<(), ExactlyOneError>> +{ [].iter().exactly_one()?; Ok(()) } #[test] fn multiunzip() { - let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2), (3, 4, 5), (6, 7, 8)].iter().cloned().multiunzip(); + let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2), (3, 4, 5), (6, 7, 8)] + .iter() + .cloned() + .multiunzip(); assert_eq!((a, b, c), (vec![0, 3, 6], vec![1, 4, 7], vec![2, 5, 8])); let (): () = [(), (), ()].iter().cloned().multiunzip(); - let t: (Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)].iter().cloned().multiunzip(); - assert_eq!(t, (vec![0], vec![1], vec![2], vec![3], vec![4], vec![5], vec![6], vec![7], vec![8], vec![9], vec![10], vec![11])); + #[allow(clippy::type_complexity)] + let t: ( + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + ) = [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)] + .iter() + .cloned() + .multiunzip(); + assert_eq!( + t, + ( + vec![0], + vec![1], + vec![2], + vec![3], + vec![4], + vec![5], + vec![6], + vec![7], + vec![8], + vec![9], + vec![10], + vec![11] + ) + ); } diff --git a/third_party/rust/itertools/tests/zip.rs b/third_party/rust/itertools/tests/zip.rs index 75157d34f3a..daed31e32da 100644 --- a/third_party/rust/itertools/tests/zip.rs +++ b/third_party/rust/itertools/tests/zip.rs @@ -1,17 +1,17 @@ -use itertools::Itertools; -use itertools::EitherOrBoth::{Both, Left, Right}; -use itertools::free::zip_eq; use itertools::multizip; +use itertools::EitherOrBoth::{Both, Left, Right}; +use itertools::Itertools; #[test] fn zip_longest_fused() { let a = [Some(1), None, Some(3), Some(4)]; let b = [1, 2, 3]; - let unfused = a.iter().batching(|it| *it.next().unwrap()) + let unfused = a + .iter() + .batching(|it| *it.next().unwrap()) .zip_longest(b.iter().cloned()); - itertools::assert_equal(unfused, - vec![Both(1, 1), Right(2), Right(3)]); + itertools::assert_equal(unfused, vec![Both(1, 1), Right(2), Right(3)]); } #[test] @@ -20,7 +20,7 @@ fn test_zip_longest_size_hint() { let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; let v2 = &[10, 11, 12]; - assert_eq!(c.zip_longest(v.iter()).size_hint(), (std::usize::MAX, None)); + assert_eq!(c.zip_longest(v.iter()).size_hint(), (usize::MAX, None)); assert_eq!(v.iter().zip_longest(v2.iter()).size_hint(), (10, Some(10))); } @@ -54,24 +54,3 @@ fn test_double_ended_zip() { assert_eq!(it.next_back(), Some((1, 1))); assert_eq!(it.next_back(), None); } - - -#[should_panic] -#[test] -fn zip_eq_panic1() -{ - let a = [1, 2]; - let b = [1, 2, 3]; - - zip_eq(&a, &b).count(); -} - -#[should_panic] -#[test] -fn zip_eq_panic2() -{ - let a: [i32; 0] = []; - let b = [1, 2, 3]; - - zip_eq(&a, &b).count(); -} diff --git a/third_party/rust/suggest/.cargo-checksum.json b/third_party/rust/suggest/.cargo-checksum.json index 138fca2f603..256ca90ccf5 100644 --- a/third_party/rust/suggest/.cargo-checksum.json +++ b/third_party/rust/suggest/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"922b2e4d85f325dbef99d5e439558a75dbfda82e1d263c2dd3bfadac9879df18","README.md":"5e28baf874b643d756228bdab345e287bf107d3182dfe6a18aafadcc4b9a3fc9","benches/benchmark_all.rs":"5909dfb1e62793afb1f2bc15b75914527a4d14fce6796307c04a309e45c0598c","metrics.yaml":"0540ab2271aeab7f07335c7ceec12acde942995f9dcb3c29070489aa61899d56","src/benchmarks/README.md":"ccee8dbddba8762d0453fa855bd6984137b224b8c019f3dd8e86a3c303f51d71","src/benchmarks/client.rs":"e5897d4e2eda06809fa6dc6db4e780b9ef266f613fb113aa6613b83f7005dd0b","src/benchmarks/geoname.rs":"00fab05cf9465cf8e22e143cde75a81885411001b240af00efda4071975d0563","src/benchmarks/ingest.rs":"1f3b5eca704c51bc8f972e7a3492a518516461e5834f97a5f7d1855a048ab16b","src/benchmarks/mod.rs":"24751c377f549ead6b6e1d46685c649f51303cc090f6374c93633f71dcf3cadf","src/benchmarks/query.rs":"d54946063e72cf98e7f46d94665c17c66af637774c2bb50cd5798dbe63d74f3c","src/bin/debug_ingestion_sizes.rs":"ce6e810be7b3fc19e826d75b622b82cfab5a1a99397a6d0833c2c4eebff2d364","src/config.rs":"0ca876e845841bb6429862c0904c82265003f53b55aea053fac60aed278586a7","src/db.rs":"566e62ab951c0a372450ffb8842ded85a0147242cf191254d895dc0fe320a58c","src/error.rs":"e2ef3ec0e0b2b8ecbb8f2f1717d4cb753af06913b8395d086b7643098ad100a7","src/fakespot.rs":"f501c9fe5296e7c130a9fcb532b861465717652cb5ef688230bc7a3b94df91b1","src/geoname.rs":"77376dbc7d06532a7797a93b863f150317df7f31d9200d375c8ea489ac8bee6f","src/lib.rs":"a4c0989a01a7c13184049c1f11bc7813cd3cbfb6354fcca1f5a7204e45a0dc9c","src/metrics.rs":"871f0d834efbbc9e26d61f66fa31f0021dcf41444746cd7c082f93ba9628e399","src/pocket.rs":"1316668840ec9b4ea886223921dc9d3b5a1731d1a5206c0b1089f2a6c45c1b7b","src/provider.rs":"cf00114a4293a4c9d956efffb8a6859f3568ea0e4868c6b63b8273daca69b0d5","src/query.rs":"66f229272c9245eb8ee0cab237071627aec599f145f64da8894bcaeb1ed7c6f9","src/rs.rs":"37cce2cb0068421f6b40e13f3bcb1f6212acee2f7117759cd095d381b25580f8","src/schema.rs":"51dfe27c01884dfbd3bb7c868c01505dd69cf119d9bb37ddb653f77ead170956","src/store.rs":"d127c58e26a3e380e815e11e6660feb58df335ab40426aa051902a6fec659b5a","src/suggestion.rs":"e74abdc1eace082ad7ed8762bcee25b1943ec3d04d7e644959c5737b42732660","src/testing/client.rs":"47a32fd84c733001f11e8bfff94dc8c060b6b0780346dca5ddc7a5f5489c1d85","src/testing/data.rs":"5b1935946185f55be2383f2f979e966155825b1b9df7913d93eb50289052639c","src/testing/mod.rs":"34120abb160a913069c3f7df03c4f52815be3461dbbf08fb0fcc4251a517ba71","src/util.rs":"52c6ec405637afa2d1a89f29fbbb7dcc341546b6deb97d326c4490bbf8713cb0","src/weather.rs":"7cc9167dcdfca49d6ad91eba6fba4d5fd49f45052f25a7fe3ad6749d3e6783fb","src/yelp.rs":"0b9dfa698d9c3162d47c0103d1799838d444345f9d7f943eedc6bcc98fd8b57d","uniffi.toml":"8205e4679ac26d53e70af0f85c013fd27cda1119f4322aebf5f2b9403d45a611"},"package":null} \ No newline at end of file +{"files":{"Cargo.toml":"922b2e4d85f325dbef99d5e439558a75dbfda82e1d263c2dd3bfadac9879df18","README.md":"5e28baf874b643d756228bdab345e287bf107d3182dfe6a18aafadcc4b9a3fc9","benches/benchmark_all.rs":"5909dfb1e62793afb1f2bc15b75914527a4d14fce6796307c04a309e45c0598c","metrics.yaml":"0540ab2271aeab7f07335c7ceec12acde942995f9dcb3c29070489aa61899d56","src/benchmarks/README.md":"ccee8dbddba8762d0453fa855bd6984137b224b8c019f3dd8e86a3c303f51d71","src/benchmarks/client.rs":"e5897d4e2eda06809fa6dc6db4e780b9ef266f613fb113aa6613b83f7005dd0b","src/benchmarks/geoname.rs":"00fab05cf9465cf8e22e143cde75a81885411001b240af00efda4071975d0563","src/benchmarks/ingest.rs":"1f3b5eca704c51bc8f972e7a3492a518516461e5834f97a5f7d1855a048ab16b","src/benchmarks/mod.rs":"24751c377f549ead6b6e1d46685c649f51303cc090f6374c93633f71dcf3cadf","src/benchmarks/query.rs":"d54946063e72cf98e7f46d94665c17c66af637774c2bb50cd5798dbe63d74f3c","src/bin/debug_ingestion_sizes.rs":"ce6e810be7b3fc19e826d75b622b82cfab5a1a99397a6d0833c2c4eebff2d364","src/config.rs":"0ca876e845841bb6429862c0904c82265003f53b55aea053fac60aed278586a7","src/db.rs":"04c04be4a71e1e671734147a0c153c7fb06254d7fe6aa016f64efd8a21826fe8","src/error.rs":"e2ef3ec0e0b2b8ecbb8f2f1717d4cb753af06913b8395d086b7643098ad100a7","src/fakespot.rs":"f501c9fe5296e7c130a9fcb532b861465717652cb5ef688230bc7a3b94df91b1","src/geoname.rs":"77376dbc7d06532a7797a93b863f150317df7f31d9200d375c8ea489ac8bee6f","src/lib.rs":"a4c0989a01a7c13184049c1f11bc7813cd3cbfb6354fcca1f5a7204e45a0dc9c","src/metrics.rs":"871f0d834efbbc9e26d61f66fa31f0021dcf41444746cd7c082f93ba9628e399","src/pocket.rs":"1316668840ec9b4ea886223921dc9d3b5a1731d1a5206c0b1089f2a6c45c1b7b","src/provider.rs":"cf00114a4293a4c9d956efffb8a6859f3568ea0e4868c6b63b8273daca69b0d5","src/query.rs":"66f229272c9245eb8ee0cab237071627aec599f145f64da8894bcaeb1ed7c6f9","src/rs.rs":"37cce2cb0068421f6b40e13f3bcb1f6212acee2f7117759cd095d381b25580f8","src/schema.rs":"56a4da91b703000dce1399467cd10b6b5c1ab32b33c9ed7b1c928b4536b48546","src/store.rs":"b9da68feba614d5df598bfb9facda115aa2aadda1c6f8374c340bada27311876","src/suggestion.rs":"bd4acd1d7f0bfd4ceebd52d44d4ea6ac639d32ef43819e217fbffaa9346b50f2","src/testing/client.rs":"47a32fd84c733001f11e8bfff94dc8c060b6b0780346dca5ddc7a5f5489c1d85","src/testing/data.rs":"5b1935946185f55be2383f2f979e966155825b1b9df7913d93eb50289052639c","src/testing/mod.rs":"34120abb160a913069c3f7df03c4f52815be3461dbbf08fb0fcc4251a517ba71","src/util.rs":"52c6ec405637afa2d1a89f29fbbb7dcc341546b6deb97d326c4490bbf8713cb0","src/weather.rs":"7cc9167dcdfca49d6ad91eba6fba4d5fd49f45052f25a7fe3ad6749d3e6783fb","src/yelp.rs":"0b9dfa698d9c3162d47c0103d1799838d444345f9d7f943eedc6bcc98fd8b57d","uniffi.toml":"8205e4679ac26d53e70af0f85c013fd27cda1119f4322aebf5f2b9403d45a611"},"package":null} \ No newline at end of file diff --git a/third_party/rust/suggest/src/db.rs b/third_party/rust/suggest/src/db.rs index 427473567d9..f643ce5dd93 100644 --- a/third_party/rust/suggest/src/db.rs +++ b/third_party/rust/suggest/src/db.rs @@ -1271,12 +1271,12 @@ impl<'a> SuggestDao<'a> { Ok(()) } - pub fn insert_dismissal(&self, url: &str) -> Result<()> { + pub fn insert_dismissal(&self, key: &str) -> Result<()> { self.conn.execute( "INSERT OR IGNORE INTO dismissed_suggestions(url) VALUES(:url)", named_params! { - ":url": url, + ":url": key, }, )?; Ok(()) @@ -1287,6 +1287,21 @@ impl<'a> SuggestDao<'a> { Ok(()) } + pub fn has_dismissal(&self, key: &str) -> Result { + Ok(self.conn.exists( + "SELECT 1 FROM dismissed_suggestions WHERE url = :url", + named_params! { + ":url": key, + }, + )?) + } + + pub fn any_dismissals(&self) -> Result { + Ok(self + .conn + .exists("SELECT 1 FROM dismissed_suggestions LIMIT 1", ())?) + } + /// Deletes all suggestions associated with a Remote Settings record from /// the database. pub fn drop_suggestions(&mut self, record_id: &SuggestRecordId) -> Result<()> { diff --git a/third_party/rust/suggest/src/schema.rs b/third_party/rust/suggest/src/schema.rs index db00c858169..c7287ebf338 100644 --- a/third_party/rust/suggest/src/schema.rs +++ b/third_party/rust/suggest/src/schema.rs @@ -23,7 +23,7 @@ use sql_support::{ /// `clear_database()` by adding their names to `conditional_tables`, unless /// they are cleared via a deletion trigger or there's some other good /// reason not to do so. -pub const VERSION: u32 = 35; +pub const VERSION: u32 = 36; /// The current Suggest database schema. pub const SQL: &str = " @@ -645,6 +645,10 @@ impl ConnectionInitializer for SuggestConnectionInitializer<'_> { )?; Ok(()) } + 35 => { + // The commit that added this migration was reverted. + Ok(()) + } _ => Err(open_database::Error::IncompatibleVersion(version)), } } diff --git a/third_party/rust/suggest/src/store.rs b/third_party/rust/suggest/src/store.rs index 951e882988e..0e4c8c53525 100644 --- a/third_party/rust/suggest/src/store.rs +++ b/third_party/rust/suggest/src/store.rs @@ -134,7 +134,7 @@ pub enum InterruptKind { /// Interrupt read operations like [SuggestStore::query] Read, /// Interrupt write operations. This mostly means [SuggestStore::ingest], but - /// [SuggestStore::dismiss_suggestion] may also be interrupted. + /// other operations may also be interrupted. Write, /// Interrupt both read and write operations, ReadWrite, @@ -204,12 +204,27 @@ impl SuggestStore { } /// Dismiss a suggestion. + /// + /// Dismissed suggestions cannot be fetched again. #[handle_error(Error)] - pub fn dismiss(&self, suggestion: &Suggestion) -> SuggestApiResult<()> { - self.inner.dismiss(suggestion) + pub fn dismiss_by_suggestion(&self, suggestion: &Suggestion) -> SuggestApiResult<()> { + self.inner.dismiss_by_suggestion(suggestion) } - /// Deprecated, use [SuggestStore::dismiss] instead. + /// Dismiss a suggestion by its dismissal key. + /// + /// Dismissed suggestions cannot be fetched again. + /// + /// Prefer [SuggestStore::dismiss_by_suggestion] if you have a + /// `crate::Suggestion`. This method is intended for cases where a + /// suggestion originates outside this component. + #[handle_error(Error)] + pub fn dismiss_by_key(&self, key: &str) -> SuggestApiResult<()> { + self.inner.dismiss_by_key(key) + } + + /// Deprecated, use [SuggestStore::dismiss_by_suggestion] or + /// [SuggestStore::dismiss_by_key] instead. /// /// Dismiss a suggestion /// @@ -225,6 +240,33 @@ impl SuggestStore { self.inner.clear_dismissed_suggestions() } + /// Return whether a suggestion has been dismissed. + /// + /// [SuggestStore::query] will never return dismissed suggestions, so + /// normally you never need to know whether a `Suggestion` has been + /// dismissed, but this method can be used to do so. + #[handle_error(Error)] + pub fn is_dismissed_by_suggestion(&self, suggestion: &Suggestion) -> SuggestApiResult { + self.inner.is_dismissed_by_suggestion(suggestion) + } + + /// Return whether a suggestion has been dismissed given its dismissal key. + /// + /// [SuggestStore::query] will never return dismissed suggestions, so + /// normally you never need to know whether a suggestion has been dismissed. + /// This method is intended for cases where a dismissal key originates + /// outside this component. + #[handle_error(Error)] + pub fn is_dismissed_by_key(&self, key: &str) -> SuggestApiResult { + self.inner.is_dismissed_by_key(key) + } + + /// Return whether any suggestions have been dismissed. + #[handle_error(Error)] + pub fn any_dismissed_suggestions(&self) -> SuggestApiResult { + self.inner.any_dismissed_suggestions() + } + /// Interrupts any ongoing queries. /// /// This should be called when the user types new input into the address @@ -448,15 +490,17 @@ impl SuggestStoreInner { }) } - fn dismiss(&self, suggestion: &Suggestion) -> Result<()> { - if let Some(dismissal_key) = suggestion.dismissal_key() { - self.dbs()? - .writer - .write(|dao| dao.insert_dismissal(dismissal_key))?; + fn dismiss_by_suggestion(&self, suggestion: &Suggestion) -> Result<()> { + if let Some(key) = suggestion.dismissal_key() { + self.dismiss_by_key(key)?; } Ok(()) } + fn dismiss_by_key(&self, key: &str) -> Result<()> { + self.dbs()?.writer.write(|dao| dao.insert_dismissal(key)) + } + fn dismiss_suggestion(&self, suggestion_url: String) -> Result<()> { self.dbs()? .writer @@ -468,6 +512,22 @@ impl SuggestStoreInner { Ok(()) } + fn is_dismissed_by_suggestion(&self, suggestion: &Suggestion) -> Result { + if let Some(key) = suggestion.dismissal_key() { + self.dbs()?.reader.read(|dao| dao.has_dismissal(key)) + } else { + Ok(false) + } + } + + fn is_dismissed_by_key(&self, key: &str) -> Result { + self.dbs()?.reader.read(|dao| dao.has_dismissal(key)) + } + + fn any_dismissed_suggestions(&self) -> Result { + self.dbs()?.reader.read(|dao| dao.any_dismissals()) + } + fn interrupt(&self, kind: Option) { if let Some(dbs) = self.dbs.get() { // Only interrupt if the databases are already open. @@ -1174,8 +1234,12 @@ pub(crate) mod tests { assert_eq!(suggestions[0].dismissal_key(), expected_dismissal_key); // Dismiss the suggestion. - store.inner.dismiss(&suggestions[0])?; + let dismissal_key = suggestions[0].dismissal_key().unwrap(); + store.inner.dismiss_by_suggestion(&suggestions[0])?; assert_eq!(store.fetch_suggestions(SuggestionQuery::amp(query)), vec![]); + assert!(store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(store.inner.any_dismissed_suggestions()?); // Clear dismissals and fetch again. store.inner.clear_dismissed_suggestions()?; @@ -1183,19 +1247,44 @@ pub(crate) mod tests { store.fetch_suggestions(SuggestionQuery::amp(query)), vec![expected_suggestion.clone()] ); + assert!(!store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(!store.inner.any_dismissed_suggestions()?); - // Dismiss the suggestion by its raw URL using the deprecated API. - store - .inner - .dismiss_suggestion(expected_suggestion.raw_url().unwrap().to_string())?; + // Dismiss the suggestion by its dismissal key. + store.inner.dismiss_by_key(dismissal_key)?; assert_eq!(store.fetch_suggestions(SuggestionQuery::amp(query)), vec![]); + assert!(store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(store.inner.any_dismissed_suggestions()?); // Clear dismissals and fetch again. store.inner.clear_dismissed_suggestions()?; assert_eq!( store.fetch_suggestions(SuggestionQuery::amp(query)), - vec![expected_suggestion] + vec![expected_suggestion.clone()] ); + assert!(!store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(!store.inner.any_dismissed_suggestions()?); + + // Dismiss the suggestion by its raw URL using the deprecated API. + let raw_url = expected_suggestion.raw_url().unwrap(); + store.inner.dismiss_suggestion(raw_url.to_string())?; + assert_eq!(store.fetch_suggestions(SuggestionQuery::amp(query)), vec![]); + assert!(store.inner.is_dismissed_by_key(raw_url)?); + assert!(store.inner.any_dismissed_suggestions()?); + + // Clear dismissals and fetch again. + store.inner.clear_dismissed_suggestions()?; + assert_eq!( + store.fetch_suggestions(SuggestionQuery::amp(query)), + vec![expected_suggestion.clone()] + ); + assert!(!store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(!store.inner.is_dismissed_by_key(raw_url)?); + assert!(!store.inner.any_dismissed_suggestions()?); } Ok(()) @@ -2452,19 +2541,32 @@ pub(crate) mod tests { let results = store.fetch_suggestions(query.clone()); assert_eq!(results.len(), 5); - for result in results { - store - .inner - .dismiss_suggestion(result.raw_url().unwrap().to_string())?; + assert!(!store.inner.any_dismissed_suggestions()?); + + for result in &results { + let dismissal_key = result.dismissal_key().unwrap(); + assert!(!store.inner.is_dismissed_by_suggestion(result)?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + store.inner.dismiss_by_suggestion(result)?; + assert!(store.inner.is_dismissed_by_suggestion(result)?); + assert!(store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(store.inner.any_dismissed_suggestions()?); } // After dismissing the suggestions, the next query shouldn't return them - assert_eq!(store.fetch_suggestions(query.clone()).len(), 0); + assert_eq!(store.fetch_suggestions(query.clone()), vec![]); // Clearing the dismissals should cause them to be returned again store.inner.clear_dismissed_suggestions()?; assert_eq!(store.fetch_suggestions(query.clone()).len(), 5); + for result in &results { + let dismissal_key = result.dismissal_key().unwrap(); + assert!(!store.inner.is_dismissed_by_suggestion(result)?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + } + assert!(!store.inner.any_dismissed_suggestions()?); + Ok(()) } @@ -3697,8 +3799,9 @@ pub(crate) mod tests { }); // Make sure the suggestions are initially fetchable. + let suggestions = store.fetch_suggestions(SuggestionQuery::dynamic("aaa", &["aaa"])); assert_eq!( - store.fetch_suggestions(SuggestionQuery::dynamic("aaa", &["aaa"])), + suggestions, vec![ Suggestion::Dynamic { suggestion_type: "aaa".to_string(), @@ -3722,7 +3825,8 @@ pub(crate) mod tests { ); // Dismiss the first suggestion. - store.inner.dismiss_suggestion("dk0".to_string())?; + assert_eq!(suggestions[0].dismissal_key(), Some("dk0")); + store.inner.dismiss_by_suggestion(&suggestions[0])?; assert_eq!( store.fetch_suggestions(SuggestionQuery::dynamic("aaa", &["aaa"])), vec![ @@ -3742,7 +3846,8 @@ pub(crate) mod tests { ); // Dismiss the second suggestion. - store.inner.dismiss_suggestion("dk1".to_string())?; + assert_eq!(suggestions[1].dismissal_key(), Some("dk1")); + store.inner.dismiss_by_suggestion(&suggestions[1])?; assert_eq!( store.fetch_suggestions(SuggestionQuery::dynamic("aaa", &["aaa"])), vec![Suggestion::Dynamic { diff --git a/third_party/rust/suggest/src/suggestion.rs b/third_party/rust/suggest/src/suggestion.rs index cb8452625ba..3d96d01b4df 100644 --- a/third_party/rust/suggest/src/suggestion.rs +++ b/third_party/rust/suggest/src/suggestion.rs @@ -146,14 +146,14 @@ impl Suggestion { self.raw_url() } } + Self::Dynamic { dismissal_key, .. } => dismissal_key.as_deref(), Self::Pocket { .. } | Self::Wikipedia { .. } | Self::Amo { .. } | Self::Yelp { .. } | Self::Mdn { .. } | Self::Weather { .. } - | Self::Fakespot { .. } - | Self::Dynamic { .. } => self.raw_url(), + | Self::Fakespot { .. } => self.raw_url(), } } diff --git a/third_party/sqlite3/ext/lib.symbols b/third_party/sqlite3/ext/lib.symbols index 14521ef4005..ee5dddc2a6c 100644 --- a/third_party/sqlite3/ext/lib.symbols +++ b/third_party/sqlite3/ext/lib.symbols @@ -3,3 +3,4 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. sqlite3_fts5_init +sqlite3_vec_init diff --git a/third_party/sqlite3/ext/moz.build b/third_party/sqlite3/ext/moz.build index ffd938b601f..b31cb14acab 100644 --- a/third_party/sqlite3/ext/moz.build +++ b/third_party/sqlite3/ext/moz.build @@ -18,6 +18,7 @@ else: SOURCES += [ "fts5.c", + "sqlite-vec/sqlite-vec.c", ] if CONFIG["OS_TARGET"] == "Linux" or CONFIG["OS_TARGET"] == "Android": diff --git a/third_party/sqlite3/ext/sqlite-vec/LICENSE-MIT b/third_party/sqlite3/ext/sqlite-vec/LICENSE-MIT new file mode 100644 index 00000000000..9c106bc48c7 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Alex Garcia + +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. diff --git a/third_party/sqlite3/ext/sqlite-vec/VERSION.txt b/third_party/sqlite3/ext/sqlite-vec/VERSION.txt new file mode 100644 index 00000000000..d9d7c74bbb7 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/VERSION.txt @@ -0,0 +1 @@ +0.1.7-alpha.2 \ No newline at end of file diff --git a/third_party/sqlite3/ext/sqlite-vec/moz.yaml b/third_party/sqlite3/ext/sqlite-vec/moz.yaml new file mode 100644 index 00000000000..84acb6584b8 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/moz.yaml @@ -0,0 +1,50 @@ +schema: 1 + +bugzilla: + product: Toolkit + component: Storage + +origin: + name: sqlite-vec + description: > + An extremely small, "fast enough" vector search SQLite extension that runs + anywhere! + url: https://github.com/asg017/sqlite-vec + release: v0.1.7-alpha.2 (2025-01-10T14:54:13-08:00). + revision: v0.1.7-alpha.2 + license: MIT + license-file: LICENSE-MIT + notes: > + Please check for eventual limitations of this extension on the Github page + official documentation. + +vendoring: + url: https://github.com/asg017/sqlite-vec + source-hosting: github + tracking: tag + vendor-directory: third_party/sqlite3/ext/sqlite-vec + skip-vendoring-steps: + - update-moz-build + exclude: + - "**" + include: + - LICENSE-MIT + - VERSION + - sqlite-vec.c + keep: + - moz.yaml + - vendor.sh + + update-actions: + - action: move-file + from: '{vendor_dir}/VERSION' + to: '{vendor_dir}/VERSION.txt' + # Linking multiple extensions in the same library ends up defining + # sqlite3_api multiple times, INIT3 is just an extern declaration. + - action: replace-in-file + pattern: 'SQLITE_EXTENSION_INIT1' + with: 'SQLITE_EXTENSION_INIT3' + file: '{vendor_dir}/sqlite-vec.c' + - action: run-script + script: '{yaml_dir}/vendor.sh' + cwd: '{vendor_dir}' diff --git a/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.c b/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.c new file mode 100644 index 00000000000..057b5d795b3 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.c @@ -0,0 +1,9751 @@ +#include "sqlite-vec.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef SQLITE_VEC_OMIT_FS +#include +#endif + +#ifndef SQLITE_CORE +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT3 +#else +#include "sqlite3.h" +#endif + +#ifndef UINT32_TYPE +#ifdef HAVE_UINT32_T +#define UINT32_TYPE uint32_t +#else +#define UINT32_TYPE unsigned int +#endif +#endif +#ifndef UINT16_TYPE +#ifdef HAVE_UINT16_T +#define UINT16_TYPE uint16_t +#else +#define UINT16_TYPE unsigned short int +#endif +#endif +#ifndef INT16_TYPE +#ifdef HAVE_INT16_T +#define INT16_TYPE int16_t +#else +#define INT16_TYPE short int +#endif +#endif +#ifndef UINT8_TYPE +#ifdef HAVE_UINT8_T +#define UINT8_TYPE uint8_t +#else +#define UINT8_TYPE unsigned char +#endif +#endif +#ifndef INT8_TYPE +#ifdef HAVE_INT8_T +#define INT8_TYPE int8_t +#else +#define INT8_TYPE signed char +#endif +#endif +#ifndef LONGDOUBLE_TYPE +#define LONGDOUBLE_TYPE long double +#endif + +#ifndef _WIN32 +#ifndef __EMSCRIPTEN__ +#ifndef __COSMOPOLITAN__ +#ifndef __wasi__ +typedef u_int8_t uint8_t; +typedef u_int16_t uint16_t; +typedef u_int64_t uint64_t; +#endif +#endif +#endif +#endif + +typedef int8_t i8; +typedef uint8_t u8; +typedef int16_t i16; +typedef int32_t i32; +typedef sqlite3_int64 i64; +typedef uint32_t u32; +typedef uint64_t u64; +typedef float f32; +typedef size_t usize; + +#ifndef UNUSED_PARAMETER +#define UNUSED_PARAMETER(X) (void)(X) +#endif + +// sqlite3_vtab_in() was added in SQLite version 3.38 (2022-02-22) +// https://www.sqlite.org/changes.html#version_3_38_0 +#if SQLITE_VERSION_NUMBER >= 3038000 +#define COMPILER_SUPPORTS_VTAB_IN 1 +#endif + +#ifndef SQLITE_SUBTYPE +#define SQLITE_SUBTYPE 0x000100000 +#endif + +#ifndef SQLITE_RESULT_SUBTYPE +#define SQLITE_RESULT_SUBTYPE 0x001000000 +#endif + +#ifndef SQLITE_INDEX_CONSTRAINT_LIMIT +#define SQLITE_INDEX_CONSTRAINT_LIMIT 73 +#endif + +#ifndef SQLITE_INDEX_CONSTRAINT_OFFSET +#define SQLITE_INDEX_CONSTRAINT_OFFSET 74 +#endif + +#define countof(x) (sizeof(x) / sizeof((x)[0])) +#define min(a, b) (((a) <= (b)) ? (a) : (b)) + +enum VectorElementType { + // clang-format off + SQLITE_VEC_ELEMENT_TYPE_FLOAT32 = 223 + 0, + SQLITE_VEC_ELEMENT_TYPE_BIT = 223 + 1, + SQLITE_VEC_ELEMENT_TYPE_INT8 = 223 + 2, + // clang-format on +}; + +#ifdef SQLITE_VEC_ENABLE_AVX +#include +#define PORTABLE_ALIGN32 __attribute__((aligned(32))) +#define PORTABLE_ALIGN64 __attribute__((aligned(64))) + +static f32 l2_sqr_float_avx(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + f32 PORTABLE_ALIGN32 TmpRes[8]; + size_t qty16 = qty >> 4; + + const f32 *pEnd1 = pVect1 + (qty16 << 4); + + __m256 diff, v1, v2; + __m256 sum = _mm256_set1_ps(0); + + while (pVect1 < pEnd1) { + v1 = _mm256_loadu_ps(pVect1); + pVect1 += 8; + v2 = _mm256_loadu_ps(pVect2); + pVect2 += 8; + diff = _mm256_sub_ps(v1, v2); + sum = _mm256_add_ps(sum, _mm256_mul_ps(diff, diff)); + + v1 = _mm256_loadu_ps(pVect1); + pVect1 += 8; + v2 = _mm256_loadu_ps(pVect2); + pVect2 += 8; + diff = _mm256_sub_ps(v1, v2); + sum = _mm256_add_ps(sum, _mm256_mul_ps(diff, diff)); + } + + _mm256_store_ps(TmpRes, sum); + return sqrt(TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3] + TmpRes[4] + + TmpRes[5] + TmpRes[6] + TmpRes[7]); +} +#endif + +#ifdef SQLITE_VEC_ENABLE_NEON +#include + +#define PORTABLE_ALIGN32 __attribute__((aligned(32))) + +// thx https://github.com/nmslib/hnswlib/pull/299/files +static f32 l2_sqr_float_neon(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + size_t qty16 = qty >> 4; + + const f32 *pEnd1 = pVect1 + (qty16 << 4); + + float32x4_t diff, v1, v2; + float32x4_t sum0 = vdupq_n_f32(0); + float32x4_t sum1 = vdupq_n_f32(0); + float32x4_t sum2 = vdupq_n_f32(0); + float32x4_t sum3 = vdupq_n_f32(0); + + while (pVect1 < pEnd1) { + v1 = vld1q_f32(pVect1); + pVect1 += 4; + v2 = vld1q_f32(pVect2); + pVect2 += 4; + diff = vsubq_f32(v1, v2); + sum0 = vfmaq_f32(sum0, diff, diff); + + v1 = vld1q_f32(pVect1); + pVect1 += 4; + v2 = vld1q_f32(pVect2); + pVect2 += 4; + diff = vsubq_f32(v1, v2); + sum1 = vfmaq_f32(sum1, diff, diff); + + v1 = vld1q_f32(pVect1); + pVect1 += 4; + v2 = vld1q_f32(pVect2); + pVect2 += 4; + diff = vsubq_f32(v1, v2); + sum2 = vfmaq_f32(sum2, diff, diff); + + v1 = vld1q_f32(pVect1); + pVect1 += 4; + v2 = vld1q_f32(pVect2); + pVect2 += 4; + diff = vsubq_f32(v1, v2); + sum3 = vfmaq_f32(sum3, diff, diff); + } + + f32 sum_scalar = + vaddvq_f32(vaddq_f32(vaddq_f32(sum0, sum1), vaddq_f32(sum2, sum3))); + const f32 *pEnd2 = pVect1 + (qty - (qty16 << 4)); + while (pVect1 < pEnd2) { + f32 diff = *pVect1 - *pVect2; + sum_scalar += diff * diff; + pVect1++; + pVect2++; + } + + return sqrt(sum_scalar); +} + +static f32 l2_sqr_int8_neon(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + i8 *pVect1 = (i8 *)pVect1v; + i8 *pVect2 = (i8 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + const i8 *pEnd1 = pVect1 + qty; + i32 sum_scalar = 0; + + while (pVect1 < pEnd1 - 7) { + // loading 8 at a time + int8x8_t v1 = vld1_s8(pVect1); + int8x8_t v2 = vld1_s8(pVect2); + pVect1 += 8; + pVect2 += 8; + + // widen to protect against overflow + int16x8_t v1_wide = vmovl_s8(v1); + int16x8_t v2_wide = vmovl_s8(v2); + + int16x8_t diff = vsubq_s16(v1_wide, v2_wide); + int16x8_t squared_diff = vmulq_s16(diff, diff); + int32x4_t sum = vpaddlq_s16(squared_diff); + + sum_scalar += vgetq_lane_s32(sum, 0) + vgetq_lane_s32(sum, 1) + + vgetq_lane_s32(sum, 2) + vgetq_lane_s32(sum, 3); + } + + // handle leftovers + while (pVect1 < pEnd1) { + i16 diff = (i16)*pVect1 - (i16)*pVect2; + sum_scalar += diff * diff; + pVect1++; + pVect2++; + } + + return sqrtf(sum_scalar); +} + +static i32 l1_int8_neon(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + i8 *pVect1 = (i8 *)pVect1v; + i8 *pVect2 = (i8 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + const int8_t *pEnd1 = pVect1 + qty; + + int32x4_t acc1 = vdupq_n_s32(0); + int32x4_t acc2 = vdupq_n_s32(0); + int32x4_t acc3 = vdupq_n_s32(0); + int32x4_t acc4 = vdupq_n_s32(0); + + while (pVect1 < pEnd1 - 63) { + int8x16_t v1 = vld1q_s8(pVect1); + int8x16_t v2 = vld1q_s8(pVect2); + int8x16_t diff1 = vabdq_s8(v1, v2); + acc1 = vaddq_s32(acc1, vpaddlq_u16(vpaddlq_u8(diff1))); + + v1 = vld1q_s8(pVect1 + 16); + v2 = vld1q_s8(pVect2 + 16); + int8x16_t diff2 = vabdq_s8(v1, v2); + acc2 = vaddq_s32(acc2, vpaddlq_u16(vpaddlq_u8(diff2))); + + v1 = vld1q_s8(pVect1 + 32); + v2 = vld1q_s8(pVect2 + 32); + int8x16_t diff3 = vabdq_s8(v1, v2); + acc3 = vaddq_s32(acc3, vpaddlq_u16(vpaddlq_u8(diff3))); + + v1 = vld1q_s8(pVect1 + 48); + v2 = vld1q_s8(pVect2 + 48); + int8x16_t diff4 = vabdq_s8(v1, v2); + acc4 = vaddq_s32(acc4, vpaddlq_u16(vpaddlq_u8(diff4))); + + pVect1 += 64; + pVect2 += 64; + } + + while (pVect1 < pEnd1 - 15) { + int8x16_t v1 = vld1q_s8(pVect1); + int8x16_t v2 = vld1q_s8(pVect2); + int8x16_t diff = vabdq_s8(v1, v2); + acc1 = vaddq_s32(acc1, vpaddlq_u16(vpaddlq_u8(diff))); + pVect1 += 16; + pVect2 += 16; + } + + int32x4_t acc = vaddq_s32(vaddq_s32(acc1, acc2), vaddq_s32(acc3, acc4)); + + int32_t sum = 0; + while (pVect1 < pEnd1) { + int32_t diff = abs((int32_t)*pVect1 - (int32_t)*pVect2); + sum += diff; + pVect1++; + pVect2++; + } + + return vaddvq_s32(acc) + sum; +} + +static double l1_f32_neon(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + const f32 *pEnd1 = pVect1 + qty; + float64x2_t acc = vdupq_n_f64(0); + + while (pVect1 < pEnd1 - 3) { + float32x4_t v1 = vld1q_f32(pVect1); + float32x4_t v2 = vld1q_f32(pVect2); + pVect1 += 4; + pVect2 += 4; + + // f32x4 -> f64x2 pad for overflow + float64x2_t low_diff = vabdq_f64(vcvt_f64_f32(vget_low_f32(v1)), + vcvt_f64_f32(vget_low_f32(v2))); + float64x2_t high_diff = + vabdq_f64(vcvt_high_f64_f32(v1), vcvt_high_f64_f32(v2)); + + acc = vaddq_f64(acc, vaddq_f64(low_diff, high_diff)); + } + + double sum = 0; + while (pVect1 < pEnd1) { + sum += fabs((double)*pVect1 - (double)*pVect2); + pVect1++; + pVect2++; + } + + return vaddvq_f64(acc) + sum; +} +#endif + +static f32 l2_sqr_float(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + f32 res = 0; + for (size_t i = 0; i < qty; i++) { + f32 t = *pVect1 - *pVect2; + pVect1++; + pVect2++; + res += t * t; + } + return sqrt(res); +} + +static f32 l2_sqr_int8(const void *pA, const void *pB, const void *pD) { + i8 *a = (i8 *)pA; + i8 *b = (i8 *)pB; + size_t d = *((size_t *)pD); + + f32 res = 0; + for (size_t i = 0; i < d; i++) { + f32 t = *a - *b; + a++; + b++; + res += t * t; + } + return sqrt(res); +} + +static f32 distance_l2_sqr_float(const void *a, const void *b, const void *d) { +#ifdef SQLITE_VEC_ENABLE_NEON + if ((*(const size_t *)d) > 16) { + return l2_sqr_float_neon(a, b, d); + } +#endif +#ifdef SQLITE_VEC_ENABLE_AVX + if (((*(const size_t *)d) % 16 == 0)) { + return l2_sqr_float_avx(a, b, d); + } +#endif + return l2_sqr_float(a, b, d); +} + +static f32 distance_l2_sqr_int8(const void *a, const void *b, const void *d) { +#ifdef SQLITE_VEC_ENABLE_NEON + if ((*(const size_t *)d) > 7) { + return l2_sqr_int8_neon(a, b, d); + } +#endif + return l2_sqr_int8(a, b, d); +} + +static i32 l1_int8(const void *pA, const void *pB, const void *pD) { + i8 *a = (i8 *)pA; + i8 *b = (i8 *)pB; + size_t d = *((size_t *)pD); + + i32 res = 0; + for (size_t i = 0; i < d; i++) { + res += abs(*a - *b); + a++; + b++; + } + + return res; +} + +static i32 distance_l1_int8(const void *a, const void *b, const void *d) { +#ifdef SQLITE_VEC_ENABLE_NEON + if ((*(const size_t *)d) > 15) { + return l1_int8_neon(a, b, d); + } +#endif + return l1_int8(a, b, d); +} + +static double l1_f32(const void *pA, const void *pB, const void *pD) { + f32 *a = (f32 *)pA; + f32 *b = (f32 *)pB; + size_t d = *((size_t *)pD); + + double res = 0; + for (size_t i = 0; i < d; i++) { + res += fabs((double)*a - (double)*b); + a++; + b++; + } + + return res; +} + +static double distance_l1_f32(const void *a, const void *b, const void *d) { +#ifdef SQLITE_VEC_ENABLE_NEON + if ((*(const size_t *)d) > 3) { + return l1_f32_neon(a, b, d); + } +#endif + return l1_f32(a, b, d); +} + +static f32 distance_cosine_float(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + f32 dot = 0; + f32 aMag = 0; + f32 bMag = 0; + for (size_t i = 0; i < qty; i++) { + dot += *pVect1 * *pVect2; + aMag += *pVect1 * *pVect1; + bMag += *pVect2 * *pVect2; + pVect1++; + pVect2++; + } + return 1 - (dot / (sqrt(aMag) * sqrt(bMag))); +} +static f32 distance_cosine_int8(const void *pA, const void *pB, + const void *pD) { + i8 *a = (i8 *)pA; + i8 *b = (i8 *)pB; + size_t d = *((size_t *)pD); + + f32 dot = 0; + f32 aMag = 0; + f32 bMag = 0; + for (size_t i = 0; i < d; i++) { + dot += *a * *b; + aMag += *a * *a; + bMag += *b * *b; + a++; + b++; + } + return 1 - (dot / (sqrt(aMag) * sqrt(bMag))); +} + +// https://github.com/facebookresearch/faiss/blob/77e2e79cd0a680adc343b9840dd865da724c579e/faiss/utils/hamming_distance/common.h#L34 +static u8 hamdist_table[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, + 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; + +static f32 distance_hamming_u8(u8 *a, u8 *b, size_t n) { + int same = 0; + for (unsigned long i = 0; i < n; i++) { + same += hamdist_table[a[i] ^ b[i]]; + } + return (f32)same; +} + +#ifdef _MSC_VER +#if !defined(__clang__) && (defined(_M_ARM) || defined(_M_ARM64)) +// From +// https://github.com/ngtcp2/ngtcp2/blob/b64f1e77b5e0d880b93d31f474147fae4a1d17cc/lib/ngtcp2_ringbuf.c, +// line 34-43 +static unsigned int __builtin_popcountl(unsigned int x) { + unsigned int c = 0; + for (; x; ++c) { + x &= x - 1; + } + return c; +} +#else +#include +#define __builtin_popcountl __popcnt64 +#endif +#endif + +static f32 distance_hamming_u64(u64 *a, u64 *b, size_t n) { + int same = 0; + for (unsigned long i = 0; i < n; i++) { + same += __builtin_popcountl(a[i] ^ b[i]); + } + return (f32)same; +} + +/** + * @brief Calculate the hamming distance between two bitvectors. + * + * @param a - first bitvector, MUST have d dimensions + * @param b - second bitvector, MUST have d dimensions + * @param d - pointer to size_t, MUST be divisible by CHAR_BIT + * @return f32 + */ +static f32 distance_hamming(const void *a, const void *b, const void *d) { + size_t dimensions = *((size_t *)d); + + if ((dimensions % 64) == 0) { + return distance_hamming_u64((u64 *)a, (u64 *)b, dimensions / 8 / CHAR_BIT); + } + return distance_hamming_u8((u8 *)a, (u8 *)b, dimensions / CHAR_BIT); +} + +// from SQLite source: +// https://github.com/sqlite/sqlite/blob/a509a90958ddb234d1785ed7801880ccb18b497e/src/json.c#L153 +static const char vecJsonIsSpaceX[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +#define vecJsonIsspace(x) (vecJsonIsSpaceX[(unsigned char)x]) + +typedef void (*vector_cleanup)(void *p); + +void vector_cleanup_noop(void *_) { UNUSED_PARAMETER(_); } + +#define JSON_SUBTYPE 74 + +void vtab_set_error(sqlite3_vtab *pVTab, const char *zFormat, ...) { + va_list args; + sqlite3_free(pVTab->zErrMsg); + va_start(args, zFormat); + pVTab->zErrMsg = sqlite3_vmprintf(zFormat, args); + va_end(args); +} +struct Array { + size_t element_size; + size_t length; + size_t capacity; + void *z; +}; + +/** + * @brief Initial an array with the given element size and capacity. + * + * @param array + * @param element_size + * @param init_capacity + * @return SQLITE_OK on success, error code on failure. Only error is + * SQLITE_NOMEM + */ +int array_init(struct Array *array, size_t element_size, size_t init_capacity) { + int sz = element_size * init_capacity; + void *z = sqlite3_malloc(sz); + if (!z) { + return SQLITE_NOMEM; + } + memset(z, 0, sz); + + array->element_size = element_size; + array->length = 0; + array->capacity = init_capacity; + array->z = z; + return SQLITE_OK; +} + +int array_append(struct Array *array, const void *element) { + if (array->length == array->capacity) { + size_t new_capacity = array->capacity * 2 + 100; + void *z = sqlite3_realloc64(array->z, array->element_size * new_capacity); + if (z) { + array->capacity = new_capacity; + array->z = z; + } else { + return SQLITE_NOMEM; + } + } + memcpy(&((unsigned char *)array->z)[array->length * array->element_size], + element, array->element_size); + array->length++; + return SQLITE_OK; +} + +void array_cleanup(struct Array *array) { + if (!array) + return; + array->element_size = 0; + array->length = 0; + array->capacity = 0; + sqlite3_free(array->z); + array->z = NULL; +} + +char *vector_subtype_name(int subtype) { + switch (subtype) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: + return "float32"; + case SQLITE_VEC_ELEMENT_TYPE_INT8: + return "int8"; + case SQLITE_VEC_ELEMENT_TYPE_BIT: + return "bit"; + } + return ""; +} +char *type_name(int type) { + switch (type) { + case SQLITE_INTEGER: + return "INTEGER"; + case SQLITE_BLOB: + return "BLOB"; + case SQLITE_TEXT: + return "TEXT"; + case SQLITE_FLOAT: + return "FLOAT"; + case SQLITE_NULL: + return "NULL"; + } + return ""; +} + +typedef void (*fvec_cleanup)(f32 *vector); + +void fvec_cleanup_noop(f32 *_) { UNUSED_PARAMETER(_); } + +static int fvec_from_value(sqlite3_value *value, f32 **vector, + size_t *dimensions, fvec_cleanup *cleanup, + char **pzErr) { + int value_type = sqlite3_value_type(value); + + if (value_type == SQLITE_BLOB) { + const void *blob = sqlite3_value_blob(value); + int bytes = sqlite3_value_bytes(value); + if (bytes == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + if ((bytes % sizeof(f32)) != 0) { + *pzErr = sqlite3_mprintf("invalid float32 vector BLOB length. Must be " + "divisible by %d, found %d", + sizeof(f32), bytes); + return SQLITE_ERROR; + } + *vector = (f32 *)blob; + *dimensions = bytes / sizeof(f32); + *cleanup = fvec_cleanup_noop; + return SQLITE_OK; + } + + if (value_type == SQLITE_TEXT) { + const char *source = (const char *)sqlite3_value_text(value); + int source_len = sqlite3_value_bytes(value); + if (source_len == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + int i = 0; + + struct Array x; + int rc = array_init(&x, sizeof(f32), ceil(source_len / 2.0)); + if (rc != SQLITE_OK) { + return rc; + } + + // advance leading whitespace to first '[' + while (i < source_len) { + if (vecJsonIsspace(source[i])) { + i++; + continue; + } + if (source[i] == '[') { + break; + } + + *pzErr = sqlite3_mprintf( + "JSON array parsing error: Input does not start with '['"); + array_cleanup(&x); + return SQLITE_ERROR; + } + if (source[i] != '[') { + *pzErr = sqlite3_mprintf( + "JSON array parsing error: Input does not start with '['"); + array_cleanup(&x); + return SQLITE_ERROR; + } + int offset = i + 1; + + while (offset < source_len) { + char *ptr = (char *)&source[offset]; + char *endptr; + + errno = 0; + double result = strtod(ptr, &endptr); + if ((errno != 0 && result == 0) // some interval error? + || (errno == ERANGE && + (result == HUGE_VAL || result == -HUGE_VAL)) // too big / smalls + ) { + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("JSON parsing error"); + return SQLITE_ERROR; + } + + if (endptr == ptr) { + if (*ptr != ']') { + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("JSON parsing error"); + return SQLITE_ERROR; + } + goto done; + } + + f32 res = (f32)result; + array_append(&x, (const void *)&res); + + offset += (endptr - ptr); + while (offset < source_len) { + if (vecJsonIsspace(source[offset])) { + offset++; + continue; + } + if (source[offset] == ',') { + offset++; + continue; + } + if (source[offset] == ']') + goto done; + break; + } + } + + done: + + if (x.length > 0) { + *vector = (f32 *)x.z; + *dimensions = x.length; + *cleanup = (fvec_cleanup)sqlite3_free; + return SQLITE_OK; + } + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + + *pzErr = sqlite3_mprintf( + "Input must have type BLOB (compact format) or TEXT (JSON), found %s", + type_name(value_type)); + return SQLITE_ERROR; +} + +static int bitvec_from_value(sqlite3_value *value, u8 **vector, + size_t *dimensions, vector_cleanup *cleanup, + char **pzErr) { + int value_type = sqlite3_value_type(value); + if (value_type == SQLITE_BLOB) { + const void *blob = sqlite3_value_blob(value); + int bytes = sqlite3_value_bytes(value); + if (bytes == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + *vector = (u8 *)blob; + *dimensions = bytes * CHAR_BIT; + *cleanup = vector_cleanup_noop; + return SQLITE_OK; + } + *pzErr = sqlite3_mprintf("Unknown type for bitvector."); + return SQLITE_ERROR; +} + +static int int8_vec_from_value(sqlite3_value *value, i8 **vector, + size_t *dimensions, vector_cleanup *cleanup, + char **pzErr) { + int value_type = sqlite3_value_type(value); + if (value_type == SQLITE_BLOB) { + const void *blob = sqlite3_value_blob(value); + int bytes = sqlite3_value_bytes(value); + if (bytes == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + *vector = (i8 *)blob; + *dimensions = bytes; + *cleanup = vector_cleanup_noop; + return SQLITE_OK; + } + + if (value_type == SQLITE_TEXT) { + const char *source = (const char *)sqlite3_value_text(value); + int source_len = sqlite3_value_bytes(value); + int i = 0; + + if (source_len == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + + struct Array x; + int rc = array_init(&x, sizeof(i8), ceil(source_len / 2.0)); + if (rc != SQLITE_OK) { + return rc; + } + + // advance leading whitespace to first '[' + while (i < source_len) { + if (vecJsonIsspace(source[i])) { + i++; + continue; + } + if (source[i] == '[') { + break; + } + + *pzErr = sqlite3_mprintf( + "JSON array parsing error: Input does not start with '['"); + array_cleanup(&x); + return SQLITE_ERROR; + } + if (source[i] != '[') { + *pzErr = sqlite3_mprintf( + "JSON array parsing error: Input does not start with '['"); + array_cleanup(&x); + return SQLITE_ERROR; + } + int offset = i + 1; + + while (offset < source_len) { + char *ptr = (char *)&source[offset]; + char *endptr; + + errno = 0; + long result = strtol(ptr, &endptr, 10); + if ((errno != 0 && result == 0) || + (errno == ERANGE && (result == LONG_MAX || result == LONG_MIN))) { + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("JSON parsing error"); + return SQLITE_ERROR; + } + + if (endptr == ptr) { + if (*ptr != ']') { + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("JSON parsing error"); + return SQLITE_ERROR; + } + goto done; + } + + if (result < INT8_MIN || result > INT8_MAX) { + sqlite3_free(x.z); + *pzErr = + sqlite3_mprintf("JSON parsing error: value out of range for int8"); + return SQLITE_ERROR; + } + + i8 res = (i8)result; + array_append(&x, (const void *)&res); + + offset += (endptr - ptr); + while (offset < source_len) { + if (vecJsonIsspace(source[offset])) { + offset++; + continue; + } + if (source[offset] == ',') { + offset++; + continue; + } + if (source[offset] == ']') + goto done; + break; + } + } + + done: + + if (x.length > 0) { + *vector = (i8 *)x.z; + *dimensions = x.length; + *cleanup = (vector_cleanup)sqlite3_free; + return SQLITE_OK; + } + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + + *pzErr = sqlite3_mprintf("Unknown type for int8 vector."); + return SQLITE_ERROR; +} + +/** + * @brief Extract a vector from a sqlite3_value. Can be a float32, int8, or bit + * vector. + * + * @param value: the sqlite3_value to read from. + * @param vector: Output pointer to vector data. + * @param dimensions: Output number of dimensions + * @param dimensions: Output vector element type + * @param cleanup + * @param pzErrorMessage + * @return int SQLITE_OK on success, error code otherwise + */ +int vector_from_value(sqlite3_value *value, void **vector, size_t *dimensions, + enum VectorElementType *element_type, + vector_cleanup *cleanup, char **pzErrorMessage) { + int subtype = sqlite3_value_subtype(value); + if (!subtype || (subtype == SQLITE_VEC_ELEMENT_TYPE_FLOAT32) || + (subtype == JSON_SUBTYPE)) { + int rc = fvec_from_value(value, (f32 **)vector, dimensions, + (fvec_cleanup *)cleanup, pzErrorMessage); + if (rc == SQLITE_OK) { + *element_type = SQLITE_VEC_ELEMENT_TYPE_FLOAT32; + } + return rc; + } + + if (subtype == SQLITE_VEC_ELEMENT_TYPE_BIT) { + int rc = bitvec_from_value(value, (u8 **)vector, dimensions, cleanup, + pzErrorMessage); + if (rc == SQLITE_OK) { + *element_type = SQLITE_VEC_ELEMENT_TYPE_BIT; + } + return rc; + } + if (subtype == SQLITE_VEC_ELEMENT_TYPE_INT8) { + int rc = int8_vec_from_value(value, (i8 **)vector, dimensions, cleanup, + pzErrorMessage); + if (rc == SQLITE_OK) { + *element_type = SQLITE_VEC_ELEMENT_TYPE_INT8; + } + return rc; + } + *pzErrorMessage = sqlite3_mprintf("Unknown subtype: %d", subtype); + return SQLITE_ERROR; +} + +int ensure_vector_match(sqlite3_value *aValue, sqlite3_value *bValue, void **a, + void **b, enum VectorElementType *element_type, + size_t *dimensions, vector_cleanup *outACleanup, + vector_cleanup *outBCleanup, char **outError) { + int rc; + enum VectorElementType aType, bType; + size_t aDims, bDims; + char *error = NULL; + vector_cleanup aCleanup, bCleanup; + + rc = vector_from_value(aValue, a, &aDims, &aType, &aCleanup, &error); + if (rc != SQLITE_OK) { + *outError = sqlite3_mprintf("Error reading 1st vector: %s", error); + sqlite3_free(error); + return SQLITE_ERROR; + } + + rc = vector_from_value(bValue, b, &bDims, &bType, &bCleanup, &error); + if (rc != SQLITE_OK) { + *outError = sqlite3_mprintf("Error reading 2nd vector: %s", error); + sqlite3_free(error); + aCleanup(a); + return SQLITE_ERROR; + } + + if (aType != bType) { + *outError = + sqlite3_mprintf("Vector type mistmatch. First vector has type %s, " + "while the second has type %s.", + vector_subtype_name(aType), vector_subtype_name(bType)); + aCleanup(*a); + bCleanup(*b); + return SQLITE_ERROR; + } + if (aDims != bDims) { + *outError = sqlite3_mprintf( + "Vector dimension mistmatch. First vector has %ld dimensions, " + "while the second has %ld dimensions.", + aDims, bDims); + aCleanup(*a); + bCleanup(*b); + return SQLITE_ERROR; + } + *element_type = aType; + *dimensions = aDims; + *outACleanup = aCleanup; + *outBCleanup = bCleanup; + return SQLITE_OK; +} + +int _cmp(const void *a, const void *b) { return (*(i64 *)a - *(i64 *)b); } + +struct VecNpyFile { + char *path; + size_t pathLength; +}; +#define SQLITE_VEC_NPY_FILE_NAME "vec0-npy-file" + +#ifndef SQLITE_VEC_OMIT_FS +static void vec_npy_file(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + char *path = (char *)sqlite3_value_text(argv[0]); + size_t pathLength = sqlite3_value_bytes(argv[0]); + struct VecNpyFile *f; + + f = sqlite3_malloc(sizeof(*f)); + if (!f) { + sqlite3_result_error_nomem(context); + return; + } + memset(f, 0, sizeof(*f)); + + f->path = path; + f->pathLength = pathLength; + sqlite3_result_pointer(context, f, SQLITE_VEC_NPY_FILE_NAME, sqlite3_free); +} +#endif + +#pragma region scalar functions +static void vec_f32(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 1); + int rc; + f32 *vector = NULL; + size_t dimensions; + fvec_cleanup cleanup; + char *errmsg; + rc = fvec_from_value(argv[0], &vector, &dimensions, &cleanup, &errmsg); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, errmsg, -1); + sqlite3_free(errmsg); + return; + } + sqlite3_result_blob(context, vector, dimensions * sizeof(f32), + (void (*)(void *))cleanup); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); +} + +static void vec_bit(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 1); + int rc; + u8 *vector; + size_t dimensions; + vector_cleanup cleanup; + char *errmsg; + rc = bitvec_from_value(argv[0], &vector, &dimensions, &cleanup, &errmsg); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, errmsg, -1); + sqlite3_free(errmsg); + return; + } + sqlite3_result_blob(context, vector, dimensions / CHAR_BIT, SQLITE_TRANSIENT); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_BIT); + cleanup(vector); +} +static void vec_int8(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 1); + int rc; + i8 *vector; + size_t dimensions; + vector_cleanup cleanup; + char *errmsg; + rc = int8_vec_from_value(argv[0], &vector, &dimensions, &cleanup, &errmsg); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, errmsg, -1); + sqlite3_free(errmsg); + return; + } + sqlite3_result_blob(context, vector, dimensions, SQLITE_TRANSIENT); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + cleanup(vector); +} + +static void vec_length(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + int rc; + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *errmsg; + enum VectorElementType elementType; + rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, &cleanup, + &errmsg); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, errmsg, -1); + sqlite3_free(errmsg); + return; + } + sqlite3_result_int64(context, dimensions); + cleanup(vector); +} + +static void vec_distance_cosine(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error( + context, "Cannot calculate cosine distance between two bitvectors.", + -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + f32 result = distance_cosine_float(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + f32 result = distance_cosine_int8(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + } + +finish: + aCleanup(a); + bCleanup(b); + return; +} + +static void vec_distance_l2(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error( + context, "Cannot calculate L2 distance between two bitvectors.", -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + f32 result = distance_l2_sqr_float(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + f32 result = distance_l2_sqr_int8(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + } + +finish: + aCleanup(a); + bCleanup(b); + return; +} + +static void vec_distance_l1(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a, *b; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error( + context, "Cannot calculate L1 distance between two bitvectors.", -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + double result = distance_l1_f32(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + i64 result = distance_l1_int8(a, b, &dimensions); + sqlite3_result_int(context, result); + goto finish; + } + } + +finish: + aCleanup(a); + bCleanup(b); + return; +} + +static void vec_distance_hamming(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_double(context, distance_hamming(a, b, &dimensions)); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + sqlite3_result_error( + context, + "Cannot calculate hamming distance between two float32 vectors.", -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + sqlite3_result_error( + context, "Cannot calculate hamming distance between two int8 vectors.", + -1); + goto finish; + } + } + +finish: + aCleanup(a); + bCleanup(b); + return; +} + +char *vec_type_name(enum VectorElementType elementType) { + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: + return "float32"; + case SQLITE_VEC_ELEMENT_TYPE_INT8: + return "int8"; + case SQLITE_VEC_ELEMENT_TYPE_BIT: + return "bit"; + } + return ""; +} + +static void vec_type(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 1); + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *pzError; + enum VectorElementType elementType; + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &cleanup, &pzError); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, pzError, -1); + sqlite3_free(pzError); + return; + } + sqlite3_result_text(context, vec_type_name(elementType), -1, SQLITE_STATIC); + cleanup(vector); +} +static void vec_quantize_binary(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + void *vector; + size_t dimensions; + vector_cleanup vectorCleanup; + char *pzError; + enum VectorElementType elementType; + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &vectorCleanup, &pzError); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, pzError, -1); + sqlite3_free(pzError); + return; + } + + if (dimensions <= 0) { + sqlite3_result_error(context, "Zero length vectors are not supported.", -1); + goto cleanup; + return; + } + if ((dimensions % CHAR_BIT) != 0) { + sqlite3_result_error( + context, + "Binary quantization requires vectors with a length divisible by 8", + -1); + goto cleanup; + return; + } + + int sz = dimensions / CHAR_BIT; + u8 *out = sqlite3_malloc(sz); + if (!out) { + sqlite3_result_error_code(context, SQLITE_NOMEM); + goto cleanup; + return; + } + memset(out, 0, sz); + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + + for (size_t i = 0; i < dimensions; i++) { + int res = ((f32 *)vector)[i] > 0.0; + out[i / 8] |= (res << (i % 8)); + } + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + for (size_t i = 0; i < dimensions; i++) { + int res = ((i8 *)vector)[i] > 0; + out[i / 8] |= (res << (i % 8)); + } + break; + } + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error(context, + "Can only binary quantize float or int8 vectors", -1); + sqlite3_free(out); + return; + } + } + sqlite3_result_blob(context, out, sz, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_BIT); + +cleanup: + vectorCleanup(vector); +} + +static void vec_quantize_int8(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + f32 *srcVector; + size_t dimensions; + fvec_cleanup srcCleanup; + char *err; + i8 *out = NULL; + int rc = fvec_from_value(argv[0], &srcVector, &dimensions, &srcCleanup, &err); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, err, -1); + sqlite3_free(err); + return; + } + + int sz = dimensions * sizeof(i8); + out = sqlite3_malloc(sz); + if (!out) { + sqlite3_result_error_nomem(context); + goto cleanup; + } + memset(out, 0, sz); + + if ((sqlite3_value_type(argv[1]) != SQLITE_TEXT) || + (sqlite3_value_bytes(argv[1]) != strlen("unit")) || + (sqlite3_stricmp((const char *)sqlite3_value_text(argv[1]), "unit") != + 0)) { + sqlite3_result_error( + context, "2nd argument to vec_quantize_int8() must be 'unit'.", -1); + sqlite3_free(out); + goto cleanup; + } + f32 step = (1.0 - (-1.0)) / 255; + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((srcVector[i] - (-1.0)) / step) - 128; + } + + sqlite3_result_blob(context, out, dimensions * sizeof(i8), sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + +cleanup: + srcCleanup(srcVector); +} + +static void vec_add(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error(context, "Cannot add two bitvectors together.", -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + size_t outSize = dimensions * sizeof(f32); + f32 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto finish; + } + memset(out, 0, outSize); + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((f32 *)a)[i] + ((f32 *)b)[i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + size_t outSize = dimensions * sizeof(i8); + i8 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto finish; + } + memset(out, 0, outSize); + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((i8 *)a)[i] + ((i8 *)b)[i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + goto finish; + } + } +finish: + aCleanup(a); + bCleanup(b); + return; +} +static void vec_sub(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error(context, "Cannot subtract two bitvectors together.", + -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + size_t outSize = dimensions * sizeof(f32); + f32 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto finish; + } + memset(out, 0, outSize); + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((f32 *)a)[i] - ((f32 *)b)[i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + size_t outSize = dimensions * sizeof(i8); + i8 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto finish; + } + memset(out, 0, outSize); + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((i8 *)a)[i] - ((i8 *)b)[i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + goto finish; + } + } +finish: + aCleanup(a); + bCleanup(b); + return; +} +static void vec_slice(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 3); + + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *err; + enum VectorElementType elementType; + + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &cleanup, &err); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, err, -1); + sqlite3_free(err); + return; + } + + int start = sqlite3_value_int(argv[1]); + int end = sqlite3_value_int(argv[2]); + + if (start < 0) { + sqlite3_result_error(context, + "slice 'start' index must be a postive number.", -1); + goto done; + } + if (end < 0) { + sqlite3_result_error(context, "slice 'end' index must be a postive number.", + -1); + goto done; + } + if (((size_t)start) > dimensions) { + sqlite3_result_error( + context, "slice 'start' index is greater than the number of dimensions", + -1); + goto done; + } + if (((size_t)end) > dimensions) { + sqlite3_result_error( + context, "slice 'end' index is greater than the number of dimensions", + -1); + goto done; + } + if (start > end) { + sqlite3_result_error(context, + "slice 'start' index is greater than 'end' index", -1); + goto done; + } + if (start == end) { + sqlite3_result_error(context, + "slice 'start' index is equal to the 'end' index, " + "vectors must have non-zero length", + -1); + goto done; + } + size_t n = end - start; + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + int outSize = n * sizeof(f32); + f32 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto done; + } + memset(out, 0, outSize); + for (size_t i = 0; i < n; i++) { + out[i] = ((f32 *)vector)[start + i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); + goto done; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + int outSize = n * sizeof(i8); + i8 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + return; + } + memset(out, 0, outSize); + for (size_t i = 0; i < n; i++) { + out[i] = ((i8 *)vector)[start + i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + goto done; + } + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + if ((start % CHAR_BIT) != 0) { + sqlite3_result_error(context, "start index must be divisible by 8.", -1); + goto done; + } + if ((end % CHAR_BIT) != 0) { + sqlite3_result_error(context, "end index must be divisible by 8.", -1); + goto done; + } + int outSize = n / CHAR_BIT; + u8 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + return; + } + memset(out, 0, outSize); + for (size_t i = 0; i < n / CHAR_BIT; i++) { + out[i] = ((u8 *)vector)[(start / CHAR_BIT) + i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_BIT); + goto done; + } + } +done: + cleanup(vector); +} + +static void vec_to_json(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *err; + enum VectorElementType elementType; + + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &cleanup, &err); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, err, -1); + sqlite3_free(err); + return; + } + + sqlite3_str *str = sqlite3_str_new(sqlite3_context_db_handle(context)); + sqlite3_str_appendall(str, "["); + for (size_t i = 0; i < dimensions; i++) { + if (i != 0) { + sqlite3_str_appendall(str, ","); + } + if (elementType == SQLITE_VEC_ELEMENT_TYPE_FLOAT32) { + f32 value = ((f32 *)vector)[i]; + if (isnan(value)) { + sqlite3_str_appendall(str, "null"); + } else { + sqlite3_str_appendf(str, "%f", value); + } + + } else if (elementType == SQLITE_VEC_ELEMENT_TYPE_INT8) { + sqlite3_str_appendf(str, "%d", ((i8 *)vector)[i]); + } else if (elementType == SQLITE_VEC_ELEMENT_TYPE_BIT) { + u8 b = (((u8 *)vector)[i / 8] >> (i % CHAR_BIT)) & 1; + sqlite3_str_appendf(str, "%d", b); + } + } + sqlite3_str_appendall(str, "]"); + int len = sqlite3_str_length(str); + char *s = sqlite3_str_finish(str); + if (s) { + sqlite3_result_text(context, s, len, sqlite3_free); + sqlite3_result_subtype(context, JSON_SUBTYPE); + } else { + sqlite3_result_error_nomem(context); + } + cleanup(vector); +} + +static void vec_normalize(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *err; + enum VectorElementType elementType; + + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &cleanup, &err); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, err, -1); + sqlite3_free(err); + return; + } + + if (elementType != SQLITE_VEC_ELEMENT_TYPE_FLOAT32) { + sqlite3_result_error( + context, "only float32 vectors are supported when normalizing", -1); + cleanup(vector); + return; + } + + int outSize = dimensions * sizeof(f32); + f32 *out = sqlite3_malloc(outSize); + if (!out) { + cleanup(vector); + sqlite3_result_error_code(context, SQLITE_NOMEM); + return; + } + memset(out, 0, outSize); + + f32 *v = (f32 *)vector; + + f32 norm = 0; + for (size_t i = 0; i < dimensions; i++) { + norm += v[i] * v[i]; + } + norm = sqrt(norm); + for (size_t i = 0; i < dimensions; i++) { + out[i] = v[i] / norm; + } + + sqlite3_result_blob(context, out, dimensions * sizeof(f32), sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); + cleanup(vector); +} + +static void _static_text_func(sqlite3_context *context, int argc, + sqlite3_value **argv) { + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + sqlite3_result_text(context, sqlite3_user_data(context), -1, SQLITE_STATIC); +} + +#pragma endregion + +enum Vec0TokenType { + TOKEN_TYPE_IDENTIFIER, + TOKEN_TYPE_DIGIT, + TOKEN_TYPE_LBRACKET, + TOKEN_TYPE_RBRACKET, + TOKEN_TYPE_PLUS, + TOKEN_TYPE_EQ, +}; +struct Vec0Token { + enum Vec0TokenType token_type; + char *start; + char *end; +}; + +int is_alpha(char x) { + return (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z'); +} +int is_digit(char x) { return (x >= '0' && x <= '9'); } +int is_whitespace(char x) { + return x == ' ' || x == '\t' || x == '\n' || x == '\r'; +} + +#define VEC0_TOKEN_RESULT_EOF 1 +#define VEC0_TOKEN_RESULT_SOME 2 +#define VEC0_TOKEN_RESULT_ERROR 3 + +int vec0_token_next(char *start, char *end, struct Vec0Token *out) { + char *ptr = start; + while (ptr < end) { + char curr = *ptr; + if (is_whitespace(curr)) { + ptr++; + continue; + } else if (curr == '+') { + ptr++; + out->start = ptr; + out->end = ptr; + out->token_type = TOKEN_TYPE_PLUS; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '[') { + ptr++; + out->start = ptr; + out->end = ptr; + out->token_type = TOKEN_TYPE_LBRACKET; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == ']') { + ptr++; + out->start = ptr; + out->end = ptr; + out->token_type = TOKEN_TYPE_RBRACKET; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '=') { + ptr++; + out->start = ptr; + out->end = ptr; + out->token_type = TOKEN_TYPE_EQ; + return VEC0_TOKEN_RESULT_SOME; + } else if (is_alpha(curr)) { + char *start = ptr; + while (ptr < end && (is_alpha(*ptr) || is_digit(*ptr) || *ptr == '_')) { + ptr++; + } + out->start = start; + out->end = ptr; + out->token_type = TOKEN_TYPE_IDENTIFIER; + return VEC0_TOKEN_RESULT_SOME; + } else if (is_digit(curr)) { + char *start = ptr; + while (ptr < end && (is_digit(*ptr))) { + ptr++; + } + out->start = start; + out->end = ptr; + out->token_type = TOKEN_TYPE_DIGIT; + return VEC0_TOKEN_RESULT_SOME; + } else { + return VEC0_TOKEN_RESULT_ERROR; + } + } + return VEC0_TOKEN_RESULT_EOF; +} + +struct Vec0Scanner { + char *start; + char *end; + char *ptr; +}; + +void vec0_scanner_init(struct Vec0Scanner *scanner, const char *source, + int source_length) { + scanner->start = (char *)source; + scanner->end = (char *)source + source_length; + scanner->ptr = (char *)source; +} +int vec0_scanner_next(struct Vec0Scanner *scanner, struct Vec0Token *out) { + int rc = vec0_token_next(scanner->start, scanner->end, out); + if (rc == VEC0_TOKEN_RESULT_SOME) { + scanner->start = out->end; + } + return rc; +} + +int vec0_parse_table_option(const char *source, int source_length, + char **out_key, int *out_key_length, + char **out_value, int *out_value_length) { + int rc; + struct Vec0Scanner scanner; + struct Vec0Token token; + char *key; + char *value; + int keyLength, valueLength; + + vec0_scanner_init(&scanner, source, source_length); + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + key = token.start; + keyLength = token.end - token.start; + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_EQ) { + return SQLITE_EMPTY; + } + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + !((token.token_type == TOKEN_TYPE_IDENTIFIER) || + (token.token_type == TOKEN_TYPE_DIGIT))) { + return SQLITE_ERROR; + } + value = token.start; + valueLength = token.end - token.start; + + rc = vec0_scanner_next(&scanner, &token); + if (rc == VEC0_TOKEN_RESULT_EOF) { + *out_key = key; + *out_key_length = keyLength; + *out_value = value; + *out_value_length = valueLength; + return SQLITE_OK; + } + return SQLITE_ERROR; +} +/** + * @brief Parse an argv[i] entry of a vec0 virtual table definition, and see if + * it's a PARTITION KEY definition. + * + * @param source: argv[i] source string + * @param source_length: length of the source string + * @param out_column_name: If it is a partition key, the output column name. Same lifetime + * as source, points to specific char * + * @param out_column_name_length: Length of out_column_name in bytes + * @param out_column_type: SQLITE_TEXT or SQLITE_INTEGER. + * @return int: SQLITE_EMPTY if not a PK, SQLITE_OK if it is. + */ +int vec0_parse_partition_key_definition(const char *source, int source_length, + char **out_column_name, + int *out_column_name_length, + int *out_column_type) { + struct Vec0Scanner scanner; + struct Vec0Token token; + char *column_name; + int column_name_length; + int column_type; + vec0_scanner_init(&scanner, source, source_length); + + // Check first token is identifier, will be the column name + int rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + column_name = token.start; + column_name_length = token.end - token.start; + + // Check the next token matches "text" or "integer", as column type + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "text", token.end - token.start) == 0) { + column_type = SQLITE_TEXT; + } else if (sqlite3_strnicmp(token.start, "int", token.end - token.start) == + 0 || + sqlite3_strnicmp(token.start, "integer", + token.end - token.start) == 0) { + column_type = SQLITE_INTEGER; + } else { + return SQLITE_EMPTY; + } + + // Check the next token is identifier and matches "partition" + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "partition", token.end - token.start) != 0) { + return SQLITE_EMPTY; + } + + // Check the next token is identifier and matches "key" + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "key", token.end - token.start) != 0) { + return SQLITE_EMPTY; + } + + *out_column_name = column_name; + *out_column_name_length = column_name_length; + *out_column_type = column_type; + + return SQLITE_OK; +} + +/** + * @brief Parse an argv[i] entry of a vec0 virtual table definition, and see if + * it's an auxiliar column definition, ie `+[name] [type]` like `+contents text` + * + * @param source: argv[i] source string + * @param source_length: length of the source string + * @param out_column_name: If it is a partition key, the output column name. Same lifetime + * as source, points to specific char * + * @param out_column_name_length: Length of out_column_name in bytes + * @param out_column_type: SQLITE_TEXT, SQLITE_INTEGER, SQLITE_FLOAT, or SQLITE_BLOB. + * @return int: SQLITE_EMPTY if not an aux column, SQLITE_OK if it is. + */ +int vec0_parse_auxiliary_column_definition(const char *source, int source_length, + char **out_column_name, + int *out_column_name_length, + int *out_column_type) { + struct Vec0Scanner scanner; + struct Vec0Token token; + char *column_name; + int column_name_length; + int column_type; + vec0_scanner_init(&scanner, source, source_length); + + // Check first token is '+', which denotes aux columns + int rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME || + token.token_type != TOKEN_TYPE_PLUS) { + return SQLITE_EMPTY; + } + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + column_name = token.start; + column_name_length = token.end - token.start; + + // Check the next token matches "text" or "integer", as column type + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "text", token.end - token.start) == 0) { + column_type = SQLITE_TEXT; + } else if (sqlite3_strnicmp(token.start, "int", token.end - token.start) == + 0 || + sqlite3_strnicmp(token.start, "integer", + token.end - token.start) == 0) { + column_type = SQLITE_INTEGER; + } else if (sqlite3_strnicmp(token.start, "float", token.end - token.start) == + 0 || + sqlite3_strnicmp(token.start, "double", + token.end - token.start) == 0) { + column_type = SQLITE_FLOAT; + } else if (sqlite3_strnicmp(token.start, "blob", token.end - token.start) ==0) { + column_type = SQLITE_BLOB; + } else { + return SQLITE_EMPTY; + } + + *out_column_name = column_name; + *out_column_name_length = column_name_length; + *out_column_type = column_type; + + return SQLITE_OK; +} + +typedef enum { + VEC0_METADATA_COLUMN_KIND_BOOLEAN, + VEC0_METADATA_COLUMN_KIND_INTEGER, + VEC0_METADATA_COLUMN_KIND_FLOAT, + VEC0_METADATA_COLUMN_KIND_TEXT, + // future: blob, date, datetime +} vec0_metadata_column_kind; + +/** + * @brief Parse an argv[i] entry of a vec0 virtual table definition, and see if + * it's an metadata column definition, ie `[name] [type]` like `is_released boolean` + * + * @param source: argv[i] source string + * @param source_length: length of the source string + * @param out_column_name: If it is a metadata column, the output column name. Same lifetime + * as source, points to specific char * + * @param out_column_name_length: Length of out_column_name in bytes + * @param out_column_type: one of vec0_metadata_column_kind + * @return int: SQLITE_EMPTY if not an metadata column, SQLITE_OK if it is. + */ +int vec0_parse_metadata_column_definition(const char *source, int source_length, + char **out_column_name, + int *out_column_name_length, + vec0_metadata_column_kind *out_column_type) { + struct Vec0Scanner scanner; + struct Vec0Token token; + char *column_name; + int column_name_length; + vec0_metadata_column_kind column_type; + int rc; + vec0_scanner_init(&scanner, source, source_length); + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME || + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + column_name = token.start; + column_name_length = token.end - token.start; + + // Check the next token matches a valid metadata type + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME || + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + char * t = token.start; + int n = token.end - token.start; + if (sqlite3_strnicmp(t, "boolean", n) == 0 || sqlite3_strnicmp(t, "bool", n) == 0) { + column_type = VEC0_METADATA_COLUMN_KIND_BOOLEAN; + }else if (sqlite3_strnicmp(t, "int64", n) == 0 || sqlite3_strnicmp(t, "integer64", n) == 0 || sqlite3_strnicmp(t, "integer", n) == 0 || sqlite3_strnicmp(t, "int", n) == 0) { + column_type = VEC0_METADATA_COLUMN_KIND_INTEGER; + }else if (sqlite3_strnicmp(t, "float", n) == 0 || sqlite3_strnicmp(t, "double", n) == 0 || sqlite3_strnicmp(t, "float64", n) == 0 || sqlite3_strnicmp(t, "f64", n) == 0) { + column_type = VEC0_METADATA_COLUMN_KIND_FLOAT; + } else if (sqlite3_strnicmp(t, "text", n) == 0) { + column_type = VEC0_METADATA_COLUMN_KIND_TEXT; + } else { + return SQLITE_EMPTY; + } + + *out_column_name = column_name; + *out_column_name_length = column_name_length; + *out_column_type = column_type; + + return SQLITE_OK; +} + +/** + * @brief Parse an argv[i] entry of a vec0 virtual table definition, and see if + * it's a PRIMARY KEY definition. + * + * @param source: argv[i] source string + * @param source_length: length of the source string + * @param out_column_name: If it is a PK, the output column name. Same lifetime + * as source, points to specific char * + * @param out_column_name_length: Length of out_column_name in bytes + * @param out_column_type: SQLITE_TEXT or SQLITE_INTEGER. + * @return int: SQLITE_EMPTY if not a PK, SQLITE_OK if it is. + */ +int vec0_parse_primary_key_definition(const char *source, int source_length, + char **out_column_name, + int *out_column_name_length, + int *out_column_type) { + struct Vec0Scanner scanner; + struct Vec0Token token; + char *column_name; + int column_name_length; + int column_type; + vec0_scanner_init(&scanner, source, source_length); + + // Check first token is identifier, will be the column name + int rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + column_name = token.start; + column_name_length = token.end - token.start; + + // Check the next token matches "text" or "integer", as column type + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "text", token.end - token.start) == 0) { + column_type = SQLITE_TEXT; + } else if (sqlite3_strnicmp(token.start, "int", token.end - token.start) == + 0 || + sqlite3_strnicmp(token.start, "integer", + token.end - token.start) == 0) { + column_type = SQLITE_INTEGER; + } else { + return SQLITE_EMPTY; + } + + // Check the next token is identifier and matches "primary" + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "primary", token.end - token.start) != 0) { + return SQLITE_EMPTY; + } + + // Check the next token is identifier and matches "key" + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "key", token.end - token.start) != 0) { + return SQLITE_EMPTY; + } + + *out_column_name = column_name; + *out_column_name_length = column_name_length; + *out_column_type = column_type; + + return SQLITE_OK; +} + +enum Vec0DistanceMetrics { + VEC0_DISTANCE_METRIC_L2 = 1, + VEC0_DISTANCE_METRIC_COSINE = 2, + VEC0_DISTANCE_METRIC_L1 = 3, +}; + +struct VectorColumnDefinition { + char *name; + int name_length; + size_t dimensions; + enum VectorElementType element_type; + enum Vec0DistanceMetrics distance_metric; +}; + +struct Vec0PartitionColumnDefinition { + int type; + char * name; + int name_length; +}; + +struct Vec0AuxiliaryColumnDefinition { + int type; + char * name; + int name_length; +}; +struct Vec0MetadataColumnDefinition { + vec0_metadata_column_kind kind; + char * name; + int name_length; +}; + +size_t vector_byte_size(enum VectorElementType element_type, + size_t dimensions) { + switch (element_type) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: + return dimensions * sizeof(f32); + case SQLITE_VEC_ELEMENT_TYPE_INT8: + return dimensions * sizeof(i8); + case SQLITE_VEC_ELEMENT_TYPE_BIT: + return dimensions / CHAR_BIT; + } + return 0; +} + +size_t vector_column_byte_size(struct VectorColumnDefinition column) { + return vector_byte_size(column.element_type, column.dimensions); +} + +/** + * @brief Parse an vec0 vtab argv[i] column definition and see if + * it's a vector column defintion, ex `contents_embedding float[768]`. + * + * @param source vec0 argv[i] item + * @param source_length length of source in bytes + * @param outColumn Output the parse vector column to this struct, if success + * @return int SQLITE_OK on success, SQLITE_EMPTY is it's not a vector column + * definition, SQLITE_ERROR on error. + */ +int vec0_parse_vector_column(const char *source, int source_length, + struct VectorColumnDefinition *outColumn) { + // parses a vector column definition like so: + // "abc float[123]", "abc_123 bit[1234]", eetc. + // https://github.com/asg017/sqlite-vec/issues/46 + int rc; + struct Vec0Scanner scanner; + struct Vec0Token token; + + char *name; + int nameLength; + enum VectorElementType elementType; + enum Vec0DistanceMetrics distanceMetric = VEC0_DISTANCE_METRIC_L2; + int dimensions; + + vec0_scanner_init(&scanner, source, source_length); + + // starts with an identifier + rc = vec0_scanner_next(&scanner, &token); + + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + name = token.start; + nameLength = token.end - token.start; + + // vector column type comes next: float, int, or bit + rc = vec0_scanner_next(&scanner, &token); + + if (rc != VEC0_TOKEN_RESULT_SOME || + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "float", 5) == 0 || + sqlite3_strnicmp(token.start, "f32", 3) == 0) { + elementType = SQLITE_VEC_ELEMENT_TYPE_FLOAT32; + } else if (sqlite3_strnicmp(token.start, "int8", 4) == 0 || + sqlite3_strnicmp(token.start, "i8", 2) == 0) { + elementType = SQLITE_VEC_ELEMENT_TYPE_INT8; + } else if (sqlite3_strnicmp(token.start, "bit", 3) == 0) { + elementType = SQLITE_VEC_ELEMENT_TYPE_BIT; + } else { + return SQLITE_EMPTY; + } + + // left '[' bracket + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_LBRACKET) { + return SQLITE_EMPTY; + } + + // digit, for vector dimension length + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_DIGIT) { + return SQLITE_ERROR; + } + dimensions = atoi(token.start); + if (dimensions <= 0) { + return SQLITE_ERROR; + } + + // // right ']' bracket + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_RBRACKET) { + return SQLITE_ERROR; + } + + // any other tokens left should be column-level options , ex `key=value` + // ex `distance_metric=L2 distance_metric=cosine` should error + while (1) { + // should be EOF or identifier (option key) + rc = vec0_scanner_next(&scanner, &token); + if (rc == VEC0_TOKEN_RESULT_EOF) { + break; + } + + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_ERROR; + } + + char *key = token.start; + int keyLength = token.end - token.start; + + if (sqlite3_strnicmp(key, "distance_metric", keyLength) == 0) { + + if (elementType == SQLITE_VEC_ELEMENT_TYPE_BIT) { + return SQLITE_ERROR; + } + // ensure equal sign after distance_metric + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_EQ) { + return SQLITE_ERROR; + } + + // distance_metric value, an identifier (L2, cosine, etc) + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_ERROR; + } + + char *value = token.start; + int valueLength = token.end - token.start; + if (sqlite3_strnicmp(value, "l2", valueLength) == 0) { + distanceMetric = VEC0_DISTANCE_METRIC_L2; + } else if (sqlite3_strnicmp(value, "l1", valueLength) == 0) { + distanceMetric = VEC0_DISTANCE_METRIC_L1; + } else if (sqlite3_strnicmp(value, "cosine", valueLength) == 0) { + distanceMetric = VEC0_DISTANCE_METRIC_COSINE; + } else { + return SQLITE_ERROR; + } + } + // unknown key + else { + return SQLITE_ERROR; + } + } + + outColumn->name = sqlite3_mprintf("%.*s", nameLength, name); + if (!outColumn->name) { + return SQLITE_ERROR; + } + outColumn->name_length = nameLength; + outColumn->distance_metric = distanceMetric; + outColumn->element_type = elementType; + outColumn->dimensions = dimensions; + return SQLITE_OK; +} + +#pragma region vec_each table function + +typedef struct vec_each_vtab vec_each_vtab; +struct vec_each_vtab { + sqlite3_vtab base; +}; + +typedef struct vec_each_cursor vec_each_cursor; +struct vec_each_cursor { + sqlite3_vtab_cursor base; + i64 iRowid; + enum VectorElementType vector_type; + void *vector; + size_t dimensions; + vector_cleanup cleanup; +}; + +static int vec_eachConnect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, sqlite3_vtab **ppVtab, + char **pzErr) { + UNUSED_PARAMETER(pAux); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(pzErr); + vec_each_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, "CREATE TABLE x(value, vector hidden)"); +#define VEC_EACH_COLUMN_VALUE 0 +#define VEC_EACH_COLUMN_VECTOR 1 + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); + *ppVtab = (sqlite3_vtab *)pNew; + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +static int vec_eachDisconnect(sqlite3_vtab *pVtab) { + vec_each_vtab *p = (vec_each_vtab *)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int vec_eachOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec_each_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec_eachClose(sqlite3_vtab_cursor *cur) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + if(pCur->vector) { + pCur->cleanup(pCur->vector); + } + sqlite3_free(pCur); + return SQLITE_OK; +} + +static int vec_eachBestIndex(sqlite3_vtab *pVTab, + sqlite3_index_info *pIdxInfo) { + UNUSED_PARAMETER(pVTab); + int hasVector = 0; + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; + // printf("i=%d iColumn=%d, op=%d, usable=%d\n", i, pCons->iColumn, + // pCons->op, pCons->usable); + switch (pCons->iColumn) { + case VEC_EACH_COLUMN_VECTOR: { + if (pCons->op == SQLITE_INDEX_CONSTRAINT_EQ && pCons->usable) { + hasVector = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + } + break; + } + } + } + if (!hasVector) { + return SQLITE_CONSTRAINT; + } + + pIdxInfo->estimatedCost = (double)100000; + pIdxInfo->estimatedRows = 100000; + + return SQLITE_OK; +} + +static int vec_eachFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, + const char *idxStr, int argc, sqlite3_value **argv) { + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + assert(argc == 1); + vec_each_cursor *pCur = (vec_each_cursor *)pVtabCursor; + + if (pCur->vector) { + pCur->cleanup(pCur->vector); + pCur->vector = NULL; + } + + char *pzErrMsg; + int rc = vector_from_value(argv[0], &pCur->vector, &pCur->dimensions, + &pCur->vector_type, &pCur->cleanup, &pzErrMsg); + if (rc != SQLITE_OK) { + return SQLITE_ERROR; + } + pCur->iRowid = 0; + return SQLITE_OK; +} + +static int vec_eachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +static int vec_eachEof(sqlite3_vtab_cursor *cur) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + return pCur->iRowid >= (i64)pCur->dimensions; +} + +static int vec_eachNext(sqlite3_vtab_cursor *cur) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + pCur->iRowid++; + return SQLITE_OK; +} + +static int vec_eachColumn(sqlite3_vtab_cursor *cur, sqlite3_context *context, + int i) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + switch (i) { + case VEC_EACH_COLUMN_VALUE: + switch (pCur->vector_type) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + sqlite3_result_double(context, ((f32 *)pCur->vector)[pCur->iRowid]); + break; + } + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + u8 x = ((u8 *)pCur->vector)[pCur->iRowid / CHAR_BIT]; + sqlite3_result_int(context, + (x & (0b10000000 >> ((pCur->iRowid % CHAR_BIT)))) > 0); + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + sqlite3_result_int(context, ((i8 *)pCur->vector)[pCur->iRowid]); + break; + } + } + + break; + } + return SQLITE_OK; +} + +static sqlite3_module vec_eachModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ vec_eachConnect, + /* xBestIndex */ vec_eachBestIndex, + /* xDisconnect */ vec_eachDisconnect, + /* xDestroy */ 0, + /* xOpen */ vec_eachOpen, + /* xClose */ vec_eachClose, + /* xFilter */ vec_eachFilter, + /* xNext */ vec_eachNext, + /* xEof */ vec_eachEof, + /* xColumn */ vec_eachColumn, + /* xRowid */ vec_eachRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0 +#endif +}; + +#pragma endregion + +#pragma region vec_npy_each table function + +enum NpyTokenType { + NPY_TOKEN_TYPE_IDENTIFIER, + NPY_TOKEN_TYPE_NUMBER, + NPY_TOKEN_TYPE_LPAREN, + NPY_TOKEN_TYPE_RPAREN, + NPY_TOKEN_TYPE_LBRACE, + NPY_TOKEN_TYPE_RBRACE, + NPY_TOKEN_TYPE_COLON, + NPY_TOKEN_TYPE_COMMA, + NPY_TOKEN_TYPE_STRING, + NPY_TOKEN_TYPE_FALSE, +}; + +struct NpyToken { + enum NpyTokenType token_type; + unsigned char *start; + unsigned char *end; +}; + +int npy_token_next(unsigned char *start, unsigned char *end, + struct NpyToken *out) { + unsigned char *ptr = start; + while (ptr < end) { + unsigned char curr = *ptr; + if (is_whitespace(curr)) { + ptr++; + continue; + } else if (curr == '(') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_LPAREN; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == ')') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_RPAREN; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '{') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_LBRACE; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '}') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_RBRACE; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == ':') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_COLON; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == ',') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_COMMA; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '\'') { + unsigned char *start = ptr; + ptr++; + while (ptr < end) { + if ((*ptr) == '\'') { + break; + } + ptr++; + } + if ((*ptr) != '\'') { + return VEC0_TOKEN_RESULT_ERROR; + } + out->start = start; + out->end = ++ptr; + out->token_type = NPY_TOKEN_TYPE_STRING; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == 'F' && + strncmp((char *)ptr, "False", strlen("False")) == 0) { + out->start = ptr; + out->end = (ptr + (int)strlen("False")); + ptr = out->end; + out->token_type = NPY_TOKEN_TYPE_FALSE; + return VEC0_TOKEN_RESULT_SOME; + } else if (is_digit(curr)) { + unsigned char *start = ptr; + while (ptr < end && (is_digit(*ptr))) { + ptr++; + } + out->start = start; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_NUMBER; + return VEC0_TOKEN_RESULT_SOME; + } else { + return VEC0_TOKEN_RESULT_ERROR; + } + } + return VEC0_TOKEN_RESULT_ERROR; +} + +struct NpyScanner { + unsigned char *start; + unsigned char *end; + unsigned char *ptr; +}; + +void npy_scanner_init(struct NpyScanner *scanner, const unsigned char *source, + int source_length) { + scanner->start = (unsigned char *)source; + scanner->end = (unsigned char *)source + source_length; + scanner->ptr = (unsigned char *)source; +} + +int npy_scanner_next(struct NpyScanner *scanner, struct NpyToken *out) { + int rc = npy_token_next(scanner->start, scanner->end, out); + if (rc == VEC0_TOKEN_RESULT_SOME) { + scanner->start = out->end; + } + return rc; +} + +#define NPY_PARSE_ERROR "Error parsing numpy array: " +int parse_npy_header(sqlite3_vtab *pVTab, const unsigned char *header, + size_t headerLength, + enum VectorElementType *out_element_type, + int *fortran_order, size_t *numElements, + size_t *numDimensions) { + + struct NpyScanner scanner; + struct NpyToken token; + int rc; + npy_scanner_init(&scanner, header, headerLength); + + if (npy_scanner_next(&scanner, &token) != VEC0_TOKEN_RESULT_SOME && + token.token_type != NPY_TOKEN_TYPE_LBRACE) { + vtab_set_error(pVTab, + NPY_PARSE_ERROR "numpy header did not start with '{'"); + return SQLITE_ERROR; + } + while (1) { + rc = npy_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME) { + vtab_set_error(pVTab, NPY_PARSE_ERROR "expected key in numpy header"); + return SQLITE_ERROR; + } + + if (token.token_type == NPY_TOKEN_TYPE_RBRACE) { + break; + } + if (token.token_type != NPY_TOKEN_TYPE_STRING) { + vtab_set_error(pVTab, NPY_PARSE_ERROR + "expected a string as key in numpy header"); + return SQLITE_ERROR; + } + unsigned char *key = token.start; + + rc = npy_scanner_next(&scanner, &token); + if ((rc != VEC0_TOKEN_RESULT_SOME) || + (token.token_type != NPY_TOKEN_TYPE_COLON)) { + vtab_set_error(pVTab, NPY_PARSE_ERROR + "expected a ':' after key in numpy header"); + return SQLITE_ERROR; + } + + if (strncmp((char *)key, "'descr'", strlen("'descr'")) == 0) { + rc = npy_scanner_next(&scanner, &token); + if ((rc != VEC0_TOKEN_RESULT_SOME) || + (token.token_type != NPY_TOKEN_TYPE_STRING)) { + vtab_set_error(pVTab, NPY_PARSE_ERROR + "expected a string value after 'descr' key"); + return SQLITE_ERROR; + } + if (strncmp((char *)token.start, "'maxChunks = 1024; + pCur->chunksBufferSize = + (vector_byte_size(element_type, numDimensions)) * pCur->maxChunks; + pCur->chunksBuffer = sqlite3_malloc(pCur->chunksBufferSize); + if (pCur->chunksBufferSize && !pCur->chunksBuffer) { + return SQLITE_NOMEM; + } + + pCur->currentChunkSize = + fread(pCur->chunksBuffer, vector_byte_size(element_type, numDimensions), + pCur->maxChunks, file); + + pCur->currentChunkIndex = 0; + pCur->elementType = element_type; + pCur->nElements = numElements; + pCur->nDimensions = numDimensions; + pCur->input_type = VEC_NPY_EACH_INPUT_FILE; + + pCur->eof = pCur->currentChunkSize == 0; + pCur->file = file; + return SQLITE_OK; +} +#endif + +int parse_npy_buffer(sqlite3_vtab *pVTab, const unsigned char *buffer, + int bufferLength, void **data, size_t *numElements, + size_t *numDimensions, + enum VectorElementType *element_type) { + + if (bufferLength < 10) { + // IMP: V03312_20150 + vtab_set_error(pVTab, "numpy array too short"); + return SQLITE_ERROR; + } + if (memcmp(NPY_MAGIC, buffer, sizeof(NPY_MAGIC)) != 0) { + // V11954_28792 + vtab_set_error(pVTab, "numpy array does not contain the 'magic' header"); + return SQLITE_ERROR; + } + + u8 major = buffer[6]; + u8 minor = buffer[7]; + uint16_t headerLength = 0; + memcpy(&headerLength, &buffer[8], sizeof(uint16_t)); + + i32 totalHeaderLength = sizeof(NPY_MAGIC) + sizeof(major) + sizeof(minor) + + sizeof(headerLength) + headerLength; + i32 dataSize = bufferLength - totalHeaderLength; + + if (dataSize < 0) { + vtab_set_error(pVTab, "numpy array header length is invalid"); + return SQLITE_ERROR; + } + + const unsigned char *header = &buffer[10]; + int fortran_order; + + int rc = parse_npy_header(pVTab, header, headerLength, element_type, + &fortran_order, numElements, numDimensions); + if (rc != SQLITE_OK) { + return rc; + } + + i32 expectedDataSize = + (*numElements * vector_byte_size(*element_type, *numDimensions)); + if (expectedDataSize != dataSize) { + vtab_set_error(pVTab, + "numpy array error: Expected a data size of %d, found %d", + expectedDataSize, dataSize); + return SQLITE_ERROR; + } + + *data = (void *)&buffer[totalHeaderLength]; + return SQLITE_OK; +} + +static int vec_npy_eachConnect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, sqlite3_vtab **ppVtab, + char **pzErr) { + UNUSED_PARAMETER(pAux); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(pzErr); + vec_npy_each_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, "CREATE TABLE x(vector, input hidden)"); +#define VEC_NPY_EACH_COLUMN_VECTOR 0 +#define VEC_NPY_EACH_COLUMN_INPUT 1 + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); + *ppVtab = (sqlite3_vtab *)pNew; + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +static int vec_npy_eachDisconnect(sqlite3_vtab *pVtab) { + vec_npy_each_vtab *p = (vec_npy_each_vtab *)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int vec_npy_eachOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec_npy_each_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec_npy_eachClose(sqlite3_vtab_cursor *cur) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; +#ifndef SQLITE_VEC_OMIT_FS + if (pCur->file) { + fclose(pCur->file); + pCur->file = NULL; + } +#endif + if (pCur->chunksBuffer) { + sqlite3_free(pCur->chunksBuffer); + pCur->chunksBuffer = NULL; + } + if (pCur->vector) { + pCur->vector = NULL; + } + sqlite3_free(pCur); + return SQLITE_OK; +} + +static int vec_npy_eachBestIndex(sqlite3_vtab *pVTab, + sqlite3_index_info *pIdxInfo) { + int hasInput; + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; + // printf("i=%d iColumn=%d, op=%d, usable=%d\n", i, pCons->iColumn, + // pCons->op, pCons->usable); + switch (pCons->iColumn) { + case VEC_NPY_EACH_COLUMN_INPUT: { + if (pCons->op == SQLITE_INDEX_CONSTRAINT_EQ && pCons->usable) { + hasInput = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + } + break; + } + } + } + if (!hasInput) { + pVTab->zErrMsg = sqlite3_mprintf("input argument is required"); + return SQLITE_ERROR; + } + + pIdxInfo->estimatedCost = (double)100000; + pIdxInfo->estimatedRows = 100000; + + return SQLITE_OK; +} + +static int vec_npy_eachFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, + const char *idxStr, int argc, + sqlite3_value **argv) { + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + assert(argc == 1); + int rc; + + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)pVtabCursor; + +#ifndef SQLITE_VEC_OMIT_FS + if (pCur->file) { + fclose(pCur->file); + pCur->file = NULL; + } +#endif + if (pCur->chunksBuffer) { + sqlite3_free(pCur->chunksBuffer); + pCur->chunksBuffer = NULL; + } + if (pCur->vector) { + pCur->vector = NULL; + } + +#ifndef SQLITE_VEC_OMIT_FS + struct VecNpyFile *f = NULL; + if ((f = sqlite3_value_pointer(argv[0], SQLITE_VEC_NPY_FILE_NAME))) { + FILE *file = fopen(f->path, "r"); + if (!file) { + vtab_set_error(pVtabCursor->pVtab, "Could not open numpy file"); + return SQLITE_ERROR; + } + + rc = parse_npy_file(pVtabCursor->pVtab, file, pCur); + if (rc != SQLITE_OK) { +#ifndef SQLITE_VEC_OMIT_FS + fclose(file); +#endif + return rc; + } + + } else +#endif + { + + const unsigned char *input = sqlite3_value_blob(argv[0]); + int inputLength = sqlite3_value_bytes(argv[0]); + void *data; + size_t numElements; + size_t numDimensions; + enum VectorElementType element_type; + + rc = parse_npy_buffer(pVtabCursor->pVtab, input, inputLength, &data, + &numElements, &numDimensions, &element_type); + if (rc != SQLITE_OK) { + return rc; + } + + pCur->vector = data; + pCur->elementType = element_type; + pCur->nElements = numElements; + pCur->nDimensions = numDimensions; + pCur->input_type = VEC_NPY_EACH_INPUT_BUFFER; + } + + pCur->iRowid = 0; + return SQLITE_OK; +} + +static int vec_npy_eachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +static int vec_npy_eachEof(sqlite3_vtab_cursor *cur) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; + if (pCur->input_type == VEC_NPY_EACH_INPUT_BUFFER) { + return (!pCur->nElements) || (size_t)pCur->iRowid >= pCur->nElements; + } + return pCur->eof; +} + +static int vec_npy_eachNext(sqlite3_vtab_cursor *cur) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; + pCur->iRowid++; + if (pCur->input_type == VEC_NPY_EACH_INPUT_BUFFER) { + return SQLITE_OK; + } + +#ifndef SQLITE_VEC_OMIT_FS + // else: input is a file + pCur->currentChunkIndex++; + if (pCur->currentChunkIndex >= pCur->currentChunkSize) { + pCur->currentChunkSize = + fread(pCur->chunksBuffer, + vector_byte_size(pCur->elementType, pCur->nDimensions), + pCur->maxChunks, pCur->file); + if (!pCur->currentChunkSize) { + pCur->eof = 1; + } + pCur->currentChunkIndex = 0; + } +#endif + return SQLITE_OK; +} + +static int vec_npy_eachColumnBuffer(vec_npy_each_cursor *pCur, + sqlite3_context *context, int i) { + switch (i) { + case VEC_NPY_EACH_COLUMN_VECTOR: { + sqlite3_result_subtype(context, pCur->elementType); + switch (pCur->elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + sqlite3_result_blob( + context, + &((unsigned char *) + pCur->vector)[pCur->iRowid * pCur->nDimensions * sizeof(f32)], + pCur->nDimensions * sizeof(f32), SQLITE_TRANSIENT); + + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + // https://github.com/asg017/sqlite-vec/issues/42 + sqlite3_result_error(context, + "vec_npy_each only supports float32 vectors", -1); + break; + } + } + + break; + } + } + return SQLITE_OK; +} +static int vec_npy_eachColumnFile(vec_npy_each_cursor *pCur, + sqlite3_context *context, int i) { + switch (i) { + case VEC_NPY_EACH_COLUMN_VECTOR: { + switch (pCur->elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + sqlite3_result_blob( + context, + &((unsigned char *) + pCur->chunksBuffer)[pCur->currentChunkIndex * + pCur->nDimensions * sizeof(f32)], + pCur->nDimensions * sizeof(f32), SQLITE_TRANSIENT); + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + // https://github.com/asg017/sqlite-vec/issues/42 + sqlite3_result_error(context, + "vec_npy_each only supports float32 vectors", -1); + break; + } + } + break; + } + } + return SQLITE_OK; +} +static int vec_npy_eachColumn(sqlite3_vtab_cursor *cur, + sqlite3_context *context, int i) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; + switch (pCur->input_type) { + case VEC_NPY_EACH_INPUT_BUFFER: + return vec_npy_eachColumnBuffer(pCur, context, i); + case VEC_NPY_EACH_INPUT_FILE: + return vec_npy_eachColumnFile(pCur, context, i); + } + return SQLITE_ERROR; +} + +static sqlite3_module vec_npy_eachModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ vec_npy_eachConnect, + /* xBestIndex */ vec_npy_eachBestIndex, + /* xDisconnect */ vec_npy_eachDisconnect, + /* xDestroy */ 0, + /* xOpen */ vec_npy_eachOpen, + /* xClose */ vec_npy_eachClose, + /* xFilter */ vec_npy_eachFilter, + /* xNext */ vec_npy_eachNext, + /* xEof */ vec_npy_eachEof, + /* xColumn */ vec_npy_eachColumn, + /* xRowid */ vec_npy_eachRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0, +#endif +}; + +#pragma endregion + +#pragma region vec0 virtual table + +#define VEC0_COLUMN_ID 0 +#define VEC0_COLUMN_USERN_START 1 +#define VEC0_COLUMN_OFFSET_DISTANCE 1 +#define VEC0_COLUMN_OFFSET_K 2 + +#define VEC0_SHADOW_INFO_NAME "\"%w\".\"%w_info\"" + +#define VEC0_SHADOW_CHUNKS_NAME "\"%w\".\"%w_chunks\"" +/// 1) schema, 2) original vtab table name +#define VEC0_SHADOW_CHUNKS_CREATE \ + "CREATE TABLE " VEC0_SHADOW_CHUNKS_NAME "(" \ + "chunk_id INTEGER PRIMARY KEY AUTOINCREMENT," \ + "size INTEGER NOT NULL," \ + "validity BLOB NOT NULL," \ + "rowids BLOB NOT NULL" \ + ");" + +#define VEC0_SHADOW_ROWIDS_NAME "\"%w\".\"%w_rowids\"" +/// 1) schema, 2) original vtab table name +#define VEC0_SHADOW_ROWIDS_CREATE_BASIC \ + "CREATE TABLE " VEC0_SHADOW_ROWIDS_NAME "(" \ + "rowid INTEGER PRIMARY KEY AUTOINCREMENT," \ + "id," \ + "chunk_id INTEGER," \ + "chunk_offset INTEGER" \ + ");" + +// vec0 tables with a text primary keys are still backed by int64 primary keys, +// since a fixed-length rowid is required for vec0 chunks. But we add a new 'id +// text unique' column to emulate a text primary key interface. +#define VEC0_SHADOW_ROWIDS_CREATE_PK_TEXT \ + "CREATE TABLE " VEC0_SHADOW_ROWIDS_NAME "(" \ + "rowid INTEGER PRIMARY KEY AUTOINCREMENT," \ + "id TEXT UNIQUE NOT NULL," \ + "chunk_id INTEGER," \ + "chunk_offset INTEGER" \ + ");" + +/// 1) schema, 2) original vtab table name +#define VEC0_SHADOW_VECTOR_N_NAME "\"%w\".\"%w_vector_chunks%02d\"" + +/// 1) schema, 2) original vtab table name +#define VEC0_SHADOW_VECTOR_N_CREATE \ + "CREATE TABLE " VEC0_SHADOW_VECTOR_N_NAME "(" \ + "rowid PRIMARY KEY," \ + "vectors BLOB NOT NULL" \ + ");" + +#define VEC0_SHADOW_AUXILIARY_NAME "\"%w\".\"%w_auxiliary\"" + +#define VEC0_SHADOW_METADATA_N_NAME "\"%w\".\"%w_metadatachunks%02d\"" +#define VEC0_SHADOW_METADATA_TEXT_DATA_NAME "\"%w\".\"%w_metadatatext%02d\"" + +#define VEC_INTERAL_ERROR "Internal sqlite-vec error: " +#define REPORT_URL "https://github.com/asg017/sqlite-vec/issues/new" + +typedef struct vec0_vtab vec0_vtab; + +#define VEC0_MAX_VECTOR_COLUMNS 16 +#define VEC0_MAX_PARTITION_COLUMNS 4 +#define VEC0_MAX_AUXILIARY_COLUMNS 16 +#define VEC0_MAX_METADATA_COLUMNS 16 + +#define SQLITE_VEC_VEC0_MAX_DIMENSIONS 8192 +#define VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH 16 +#define VEC0_METADATA_TEXT_VIEW_DATA_LENGTH 12 + +typedef enum { + // vector column, ie "contents_embedding float[1024]" + SQLITE_VEC0_USER_COLUMN_KIND_VECTOR = 1, + + // partition key column, ie "user_id integer partition key" + SQLITE_VEC0_USER_COLUMN_KIND_PARTITION = 2, + + // + SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY = 3, + + // metadata column that can be filtered, ie "genre text" + SQLITE_VEC0_USER_COLUMN_KIND_METADATA = 4, +} vec0_user_column_kind; + +struct vec0_vtab { + sqlite3_vtab base; + + // the SQLite connection of the host database + sqlite3 *db; + + // True if the primary key of the vec0 table has a column type TEXT. + // Will change the schema of the _rowids table, and insert/query logic. + int pkIsText; + + // number of defined vector columns. + int numVectorColumns; + + // number of defined PARTITION KEY columns. + int numPartitionColumns; + + // number of defined auxiliary columns + int numAuxiliaryColumns; + + // number of defined metadata columns + int numMetadataColumns; + + + // Name of the schema the table exists on. + // Must be freed with sqlite3_free() + char *schemaName; + + // Name of the table the table exists on. + // Must be freed with sqlite3_free() + char *tableName; + + // Name of the _rowids shadow table. + // Must be freed with sqlite3_free() + char *shadowRowidsName; + + // Name of the _chunks shadow table. + // Must be freed with sqlite3_free() + char *shadowChunksName; + + // contains enum vec0_user_column_kind values for up to + // numVectorColumns + numPartitionColumns entries + vec0_user_column_kind user_column_kinds[VEC0_MAX_VECTOR_COLUMNS + VEC0_MAX_PARTITION_COLUMNS + VEC0_MAX_AUXILIARY_COLUMNS + VEC0_MAX_METADATA_COLUMNS]; + + uint8_t user_column_idxs[VEC0_MAX_VECTOR_COLUMNS + VEC0_MAX_PARTITION_COLUMNS + VEC0_MAX_AUXILIARY_COLUMNS + VEC0_MAX_METADATA_COLUMNS]; + + + // Name of all the vector chunk shadow tables. + // Ex '_vector_chunks00' + // Only the first numVectorColumns entries will be available. + // The first numVectorColumns entries must be freed with sqlite3_free() + char *shadowVectorChunksNames[VEC0_MAX_VECTOR_COLUMNS]; + + // Name of all metadata chunk shadow tables, ie `_metadatachunks00` + // Only the first numMetadataColumns entries will be available. + // The first numMetadataColumns entries must be freed with sqlite3_free() + char *shadowMetadataChunksNames[VEC0_MAX_METADATA_COLUMNS]; + + struct VectorColumnDefinition vector_columns[VEC0_MAX_VECTOR_COLUMNS]; + struct Vec0PartitionColumnDefinition paritition_columns[VEC0_MAX_PARTITION_COLUMNS]; + struct Vec0AuxiliaryColumnDefinition auxiliary_columns[VEC0_MAX_AUXILIARY_COLUMNS]; + struct Vec0MetadataColumnDefinition metadata_columns[VEC0_MAX_METADATA_COLUMNS]; + + int chunk_size; + + // select latest chunk from _chunks, getting chunk_id + sqlite3_stmt *stmtLatestChunk; + + /** + * Statement to insert a row into the _rowids table, with a rowid. + * Parameters: + * 1: int64, rowid to insert + * Result columns: none + * SQL: "INSERT INTO _rowids(rowid) VALUES (?)" + * + * Must be cleaned up with sqlite3_finalize(). + */ + sqlite3_stmt *stmtRowidsInsertRowid; + + /** + * Statement to insert a row into the _rowids table, with an id. + * The id column isn't a tradition primary key, but instead a unique + * column to handle "text primary key" vec0 tables. The true int64 rowid + * can be retrieved after inserting with sqlite3_last_rowid(). + * + * Parameters: + * 1: text or null, id to insert + * Result columns: none + * + * Must be cleaned up with sqlite3_finalize(). + */ + sqlite3_stmt *stmtRowidsInsertId; + + /** + * Statement to update the "position" columns chunk_id and chunk_offset for + * a given _rowids row. Used when the "next available" chunk position is found + * for a vector. + * + * Parameters: + * 1: int64, chunk_id value + * 2: int64, chunk_offset value + * 3: int64, rowid value + * Result columns: none + * + * Must be cleaned up with sqlite3_finalize(). + */ + sqlite3_stmt *stmtRowidsUpdatePosition; + + /** + * Statement to quickly find the chunk_id + chunk_offset of a given row. + * Parameters: + * 1: rowid of the row/vector to lookup + * Result columns: + * 0: chunk_id (i64) + * 1: chunk_offset (i64) + * SQL: "SELECT id, chunk_id, chunk_offset FROM _rowids WHERE rowid = ?"" + * + * Must be cleaned up with sqlite3_finalize(). + */ + sqlite3_stmt *stmtRowidsGetChunkPosition; +}; + +/** + * @brief Finalize all the sqlite3_stmt members in a vec0_vtab. + * + * @param p vec0_vtab pointer + */ +void vec0_free_resources(vec0_vtab *p) { + sqlite3_finalize(p->stmtLatestChunk); + p->stmtLatestChunk = NULL; + sqlite3_finalize(p->stmtRowidsInsertRowid); + p->stmtRowidsInsertRowid = NULL; + sqlite3_finalize(p->stmtRowidsInsertId); + p->stmtRowidsInsertId = NULL; + sqlite3_finalize(p->stmtRowidsUpdatePosition); + p->stmtRowidsUpdatePosition = NULL; + sqlite3_finalize(p->stmtRowidsGetChunkPosition); + p->stmtRowidsGetChunkPosition = NULL; +} + +/** + * @brief Free all memory and sqlite3_stmt members of a vec0_vtab + * + * @param p vec0_vtab pointer + */ +void vec0_free(vec0_vtab *p) { + vec0_free_resources(p); + + sqlite3_free(p->schemaName); + p->schemaName = NULL; + sqlite3_free(p->tableName); + p->tableName = NULL; + sqlite3_free(p->shadowChunksName); + p->shadowChunksName = NULL; + sqlite3_free(p->shadowRowidsName); + p->shadowRowidsName = NULL; + + for (int i = 0; i < p->numVectorColumns; i++) { + sqlite3_free(p->shadowVectorChunksNames[i]); + p->shadowVectorChunksNames[i] = NULL; + + sqlite3_free(p->vector_columns[i].name); + p->vector_columns[i].name = NULL; + } +} + +int vec0_num_defined_user_columns(vec0_vtab *p) { + return p->numVectorColumns + p->numPartitionColumns + p->numAuxiliaryColumns + p->numMetadataColumns; +} + +/** + * @brief Returns the index of the distance hidden column for the given vec0 + * table. + * + * @param p vec0 table + * @return int + */ +int vec0_column_distance_idx(vec0_vtab *p) { + return VEC0_COLUMN_USERN_START + (vec0_num_defined_user_columns(p) - 1) + + VEC0_COLUMN_OFFSET_DISTANCE; +} + +/** + * @brief Returns the index of the k hidden column for the given vec0 table. + * + * @param p vec0 table + * @return int k column index + */ +int vec0_column_k_idx(vec0_vtab *p) { + return VEC0_COLUMN_USERN_START + (vec0_num_defined_user_columns(p) - 1) + + VEC0_COLUMN_OFFSET_K; +} + +/** + * Returns 1 if the given column-based index is a valid vector column, + * 0 otherwise. + */ +int vec0_column_idx_is_vector(vec0_vtab *pVtab, int column_idx) { + return column_idx >= VEC0_COLUMN_USERN_START && + column_idx <= (VEC0_COLUMN_USERN_START + vec0_num_defined_user_columns(pVtab) - 1) && + pVtab->user_column_kinds[column_idx - VEC0_COLUMN_USERN_START] == SQLITE_VEC0_USER_COLUMN_KIND_VECTOR; +} + +/** + * Returns the vector index of the given user column index. + * ONLY call if validated with vec0_column_idx_is_vector before + */ +int vec0_column_idx_to_vector_idx(vec0_vtab *pVtab, int column_idx) { + UNUSED_PARAMETER(pVtab); + return pVtab->user_column_idxs[column_idx - VEC0_COLUMN_USERN_START]; +} +/** + * Returns 1 if the given column-based index is a "partition key" column, + * 0 otherwise. + */ +int vec0_column_idx_is_partition(vec0_vtab *pVtab, int column_idx) { + return column_idx >= VEC0_COLUMN_USERN_START && + column_idx <= (VEC0_COLUMN_USERN_START + vec0_num_defined_user_columns(pVtab) - 1) && + pVtab->user_column_kinds[column_idx - VEC0_COLUMN_USERN_START] == SQLITE_VEC0_USER_COLUMN_KIND_PARTITION; +} + +/** + * Returns the partition column index of the given user column index. + * ONLY call if validated with vec0_column_idx_is_vector before + */ +int vec0_column_idx_to_partition_idx(vec0_vtab *pVtab, int column_idx) { + UNUSED_PARAMETER(pVtab); + return pVtab->user_column_idxs[column_idx - VEC0_COLUMN_USERN_START]; +} + +/** + * Returns 1 if the given column-based index is a auxiliary column, + * 0 otherwise. + */ +int vec0_column_idx_is_auxiliary(vec0_vtab *pVtab, int column_idx) { + return column_idx >= VEC0_COLUMN_USERN_START && + column_idx <= (VEC0_COLUMN_USERN_START + vec0_num_defined_user_columns(pVtab) - 1) && + pVtab->user_column_kinds[column_idx - VEC0_COLUMN_USERN_START] == SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY; +} + +/** + * Returns the auxiliary column index of the given user column index. + * ONLY call if validated with vec0_column_idx_to_partition_idx before + */ +int vec0_column_idx_to_auxiliary_idx(vec0_vtab *pVtab, int column_idx) { + UNUSED_PARAMETER(pVtab); + return pVtab->user_column_idxs[column_idx - VEC0_COLUMN_USERN_START]; +} + +/** + * Returns 1 if the given column-based index is a metadata column, + * 0 otherwise. + */ +int vec0_column_idx_is_metadata(vec0_vtab *pVtab, int column_idx) { + return column_idx >= VEC0_COLUMN_USERN_START && + column_idx <= (VEC0_COLUMN_USERN_START + vec0_num_defined_user_columns(pVtab) - 1) && + pVtab->user_column_kinds[column_idx - VEC0_COLUMN_USERN_START] == SQLITE_VEC0_USER_COLUMN_KIND_METADATA; +} + +/** + * Returns the metadata column index of the given user column index. + * ONLY call if validated with vec0_column_idx_is_metadata before + */ +int vec0_column_idx_to_metadata_idx(vec0_vtab *pVtab, int column_idx) { + UNUSED_PARAMETER(pVtab); + return pVtab->user_column_idxs[column_idx - VEC0_COLUMN_USERN_START]; +} + +/** + * @brief Retrieve the chunk_id, chunk_offset, and possible "id" value + * of a vec0_vtab row with the provided rowid + * + * @param p vec0_vtab + * @param rowid the rowid of the row to query + * @param id output, optional sqlite3_value to provide the id. + * Useful for text PK rows. Must be freed with sqlite3_value_free() + * @param chunk_id output, the chunk_id the row belongs to + * @param chunk_offset output, the offset within the chunk the row belongs to + * @return SQLITE_ROW on success, error code otherwise. SQLITE_EMPTY if row DNE + */ +int vec0_get_chunk_position(vec0_vtab *p, i64 rowid, sqlite3_value **id, + i64 *chunk_id, i64 *chunk_offset) { + int rc; + + if (!p->stmtRowidsGetChunkPosition) { + const char *zSql = + sqlite3_mprintf("SELECT id, chunk_id, chunk_offset " + "FROM " VEC0_SHADOW_ROWIDS_NAME " WHERE rowid = ?", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtRowidsGetChunkPosition, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + vtab_set_error( + &p->base, VEC_INTERAL_ERROR + "could not initialize 'rowids get chunk position' statement"); + goto cleanup; + } + } + + sqlite3_bind_int64(p->stmtRowidsGetChunkPosition, 1, rowid); + rc = sqlite3_step(p->stmtRowidsGetChunkPosition); + // special case: when no results, return SQLITE_EMPTY to convey "that chunk + // position doesnt exist" + if (rc == SQLITE_DONE) { + rc = SQLITE_EMPTY; + goto cleanup; + } + if (rc != SQLITE_ROW) { + goto cleanup; + } + + if (id) { + sqlite3_value *value = + sqlite3_column_value(p->stmtRowidsGetChunkPosition, 0); + *id = sqlite3_value_dup(value); + if (!*id) { + rc = SQLITE_NOMEM; + goto cleanup; + } + } + + if (chunk_id) { + *chunk_id = sqlite3_column_int64(p->stmtRowidsGetChunkPosition, 1); + } + if (chunk_offset) { + *chunk_offset = sqlite3_column_int64(p->stmtRowidsGetChunkPosition, 2); + } + + rc = SQLITE_OK; + +cleanup: + sqlite3_reset(p->stmtRowidsGetChunkPosition); + sqlite3_clear_bindings(p->stmtRowidsGetChunkPosition); + return rc; +} + +/** + * @brief Return the id value from the _rowids table where _rowids.rowid = + * rowid. + * + * @param pVtab: vec0 table to query + * @param rowid: rowid of the row to query. + * @param out: A dup'ed sqlite3_value of the id column. Might be null. + * Must be cleaned up with sqlite3_value_free(). + * @returns SQLITE_OK on success, error code on failure + */ +int vec0_get_id_value_from_rowid(vec0_vtab *pVtab, i64 rowid, + sqlite3_value **out) { + // PERF: different strategy than get_chunk_position? + return vec0_get_chunk_position((vec0_vtab *)pVtab, rowid, out, NULL, NULL); +} + +int vec0_rowid_from_id(vec0_vtab *p, sqlite3_value *valueId, i64 *rowid) { + sqlite3_stmt *stmt = NULL; + int rc; + char *zSql; + zSql = sqlite3_mprintf("SELECT rowid" + " FROM " VEC0_SHADOW_ROWIDS_NAME " WHERE id = ?", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_bind_value(stmt, 1, valueId); + rc = sqlite3_step(stmt); + if (rc == SQLITE_DONE) { + rc = SQLITE_EMPTY; + goto cleanup; + } + if (rc != SQLITE_ROW) { + goto cleanup; + } + *rowid = sqlite3_column_int64(stmt, 0); + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + goto cleanup; + } + + rc = SQLITE_OK; + +cleanup: + sqlite3_finalize(stmt); + return rc; +} + +int vec0_result_id(vec0_vtab *p, sqlite3_context *context, i64 rowid) { + if (!p->pkIsText) { + sqlite3_result_int64(context, rowid); + return SQLITE_OK; + } + sqlite3_value *valueId; + int rc = vec0_get_id_value_from_rowid(p, rowid, &valueId); + if (rc != SQLITE_OK) { + return rc; + } + if (!valueId) { + sqlite3_result_error_nomem(context); + } else { + sqlite3_result_value(context, valueId); + sqlite3_value_free(valueId); + } + return SQLITE_OK; +} + +/** + * @brief + * + * @param pVtab: virtual table to query + * @param rowid: row to lookup + * @param vector_column_idx: which vector column to query + * @param outVector: Output pointer to the vector buffer. + * Must be sqlite3_free()'ed. + * @param outVectorSize: Pointer to a int where the size of outVector + * will be stored. + * @return int SQLITE_OK on success. + */ +int vec0_get_vector_data(vec0_vtab *pVtab, i64 rowid, int vector_column_idx, + void **outVector, int *outVectorSize) { + vec0_vtab *p = pVtab; + int rc, brc; + i64 chunk_id; + i64 chunk_offset; + size_t size; + void *buf = NULL; + int blobOffset; + sqlite3_blob *vectorBlob = NULL; + assert((vector_column_idx >= 0) && + (vector_column_idx < pVtab->numVectorColumns)); + + rc = vec0_get_chunk_position(pVtab, rowid, NULL, &chunk_id, &chunk_offset); + if (rc == SQLITE_EMPTY) { + vtab_set_error(&pVtab->base, "Could not find a row with rowid %lld", rowid); + goto cleanup; + } + if (rc != SQLITE_OK) { + goto cleanup; + } + + rc = sqlite3_blob_open(p->db, p->schemaName, + p->shadowVectorChunksNames[vector_column_idx], + "vectors", chunk_id, 0, &vectorBlob); + + if (rc != SQLITE_OK) { + vtab_set_error(&pVtab->base, + "Could not fetch vector data for %lld, opening blob failed", + rowid); + rc = SQLITE_ERROR; + goto cleanup; + } + + size = vector_column_byte_size(pVtab->vector_columns[vector_column_idx]); + blobOffset = chunk_offset * size; + + buf = sqlite3_malloc(size); + if (!buf) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + rc = sqlite3_blob_read(vectorBlob, buf, size, blobOffset); + if (rc != SQLITE_OK) { + sqlite3_free(buf); + buf = NULL; + vtab_set_error( + &pVtab->base, + "Could not fetch vector data for %lld, reading from blob failed", + rowid); + rc = SQLITE_ERROR; + goto cleanup; + } + + *outVector = buf; + if (outVectorSize) { + *outVectorSize = size; + } + rc = SQLITE_OK; + +cleanup: + brc = sqlite3_blob_close(vectorBlob); + if ((rc == SQLITE_OK) && (brc != SQLITE_OK)) { + vtab_set_error( + &p->base, VEC_INTERAL_ERROR + "unknown error, could not close vector blob, please file an issue"); + return brc; + } + + return rc; +} + +/** + * @brief Retrieve the sqlite3_value of the i'th partition value for the given row. + * + * @param pVtab - the vec0_vtab in questions + * @param rowid - rowid of target row + * @param partition_idx - which partition column to retrieve + * @param outValue - output sqlite3_value + * @return int - SQLITE_OK on success, otherwise error code + */ +int vec0_get_partition_value_for_rowid(vec0_vtab *pVtab, i64 rowid, int partition_idx, sqlite3_value ** outValue) { + int rc; + i64 chunk_id; + i64 chunk_offset; + rc = vec0_get_chunk_position(pVtab, rowid, NULL, &chunk_id, &chunk_offset); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_stmt * stmt = NULL; + char * zSql = sqlite3_mprintf("SELECT partition%02d FROM " VEC0_SHADOW_CHUNKS_NAME " WHERE chunk_id = ?", partition_idx, pVtab->schemaName, pVtab->tableName); + if(!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(pVtab->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_bind_int64(stmt, 1, chunk_id); + rc = sqlite3_step(stmt); + if(rc != SQLITE_ROW) { + rc = SQLITE_ERROR; + goto done; + } + *outValue = sqlite3_value_dup(sqlite3_column_value(stmt, 0)); + if(!*outValue) { + rc = SQLITE_NOMEM; + goto done; + } + rc = SQLITE_OK; + + done: + sqlite3_finalize(stmt); + return rc; + +} + +/** + * @brief Get the value of an auxiliary column for the given rowid + * + * @param pVtab vec0_vtab + * @param rowid the rowid of the row to lookup + * @param auxiliary_idx aux index of the column we care about + * @param outValue Output sqlite3_value to store + * @return int SQLITE_OK on success, error code otherwise + */ +int vec0_get_auxiliary_value_for_rowid(vec0_vtab *pVtab, i64 rowid, int auxiliary_idx, sqlite3_value ** outValue) { + int rc; + sqlite3_stmt * stmt = NULL; + char * zSql = sqlite3_mprintf("SELECT value%02d FROM " VEC0_SHADOW_AUXILIARY_NAME " WHERE rowid = ?", auxiliary_idx, pVtab->schemaName, pVtab->tableName); + if(!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(pVtab->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if(rc != SQLITE_ROW) { + rc = SQLITE_ERROR; + goto done; + } + *outValue = sqlite3_value_dup(sqlite3_column_value(stmt, 0)); + if(!*outValue) { + rc = SQLITE_NOMEM; + goto done; + } + rc = SQLITE_OK; + + done: + sqlite3_finalize(stmt); + return rc; +} + +/** + * @brief Result the given metadata value for the given row and metadata column index. + * Will traverse the metadatachunksNN table with BLOB I/0 for the given rowid. + * + * @param p + * @param rowid + * @param metadata_idx + * @param context + * @return int + */ +int vec0_result_metadata_value_for_rowid(vec0_vtab *p, i64 rowid, int metadata_idx, sqlite3_context * context) { + int rc; + i64 chunk_id; + i64 chunk_offset; + rc = vec0_get_chunk_position(p, rowid, NULL, &chunk_id, &chunk_offset); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_blob * blobValue; + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_idx], "data", chunk_id, 0, &blobValue); + if(rc != SQLITE_OK) { + return rc; + } + + switch(p->metadata_columns[metadata_idx].kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + u8 block; + rc = sqlite3_blob_read(blobValue, &block, sizeof(block), chunk_offset / CHAR_BIT); + if(rc != SQLITE_OK) { + goto done; + } + int value = block >> ((chunk_offset % CHAR_BIT)) & 1; + sqlite3_result_int(context, value); + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + i64 value; + rc = sqlite3_blob_read(blobValue, &value, sizeof(value), chunk_offset * sizeof(i64)); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_result_int64(context, value); + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + double value; + rc = sqlite3_blob_read(blobValue, &value, sizeof(value), chunk_offset * sizeof(double)); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_result_double(context, value); + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + rc = sqlite3_blob_read(blobValue, &view, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH, chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(rc != SQLITE_OK) { + goto done; + } + int length = ((int *)view)[0]; + if(length <= VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + sqlite3_result_text(context, (const char*) (view + 4), length, SQLITE_TRANSIENT); + } + else { + sqlite3_stmt * stmt; + const char * zSql = sqlite3_mprintf("SELECT data FROM " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " WHERE rowid = ?", p->schemaName, p->tableName, metadata_idx); + if(!zSql) { + rc = SQLITE_ERROR; + goto done; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free((void *) zSql); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if(rc != SQLITE_ROW) { + sqlite3_finalize(stmt); + rc = SQLITE_ERROR; + goto done; + } + sqlite3_result_value(context, sqlite3_column_value(stmt, 0)); + sqlite3_finalize(stmt); + rc = SQLITE_OK; + } + break; + } + } + done: + // blobValue is read-only, will not fail on close + sqlite3_blob_close(blobValue); + return rc; + +} + +int vec0_get_latest_chunk_rowid(vec0_vtab *p, i64 *chunk_rowid, sqlite3_value ** partitionKeyValues) { + int rc; + const char *zSql; + // lazy initialize stmtLatestChunk when needed. May be cleared during xSync() + if (!p->stmtLatestChunk) { + if(p->numPartitionColumns > 0) { + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "SELECT max(rowid) FROM " VEC0_SHADOW_CHUNKS_NAME " WHERE ", + p->schemaName, p->tableName); + + for(int i = 0; i < p->numPartitionColumns; i++) { + if(i != 0) { + sqlite3_str_appendall(s, " AND "); + } + sqlite3_str_appendf(s, " partition%02d = ? ", i); + } + zSql = sqlite3_str_finish(s); + }else { + zSql = sqlite3_mprintf("SELECT max(rowid) FROM " VEC0_SHADOW_CHUNKS_NAME, + p->schemaName, p->tableName); + } + + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtLatestChunk, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + // IMP: V21406_05476 + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "could not initialize 'latest chunk' statement"); + goto cleanup; + } + } + + for(int i = 0; i < p->numPartitionColumns; i++) { + sqlite3_bind_value(p->stmtLatestChunk, i+1, (partitionKeyValues[i])); + } + + rc = sqlite3_step(p->stmtLatestChunk); + if (rc != SQLITE_ROW) { + // IMP: V31559_15629 + vtab_set_error(&p->base, VEC_INTERAL_ERROR "Could not find latest chunk"); + rc = SQLITE_ERROR; + goto cleanup; + } + if(sqlite3_column_type(p->stmtLatestChunk, 0) == SQLITE_NULL){ + rc = SQLITE_EMPTY; + goto cleanup; + } + *chunk_rowid = sqlite3_column_int64(p->stmtLatestChunk, 0); + rc = sqlite3_step(p->stmtLatestChunk); + if (rc != SQLITE_DONE) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "unknown result code when closing out stmtLatestChunk. " + "Please file an issue: " REPORT_URL, + p->schemaName, p->shadowChunksName); + goto cleanup; + } + rc = SQLITE_OK; + +cleanup: + if (p->stmtLatestChunk) { + sqlite3_reset(p->stmtLatestChunk); + sqlite3_clear_bindings(p->stmtLatestChunk); + } + return rc; +} + +int vec0_rowids_insert_rowid(vec0_vtab *p, i64 rowid) { + int rc = SQLITE_OK; + int entered = 0; + UNUSED_PARAMETER(entered); // temporary + if (!p->stmtRowidsInsertRowid) { + const char *zSql = + sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_ROWIDS_NAME "(rowid)" + "VALUES (?);", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtRowidsInsertRowid, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "could not initialize 'insert rowids' statement"); + goto cleanup; + } + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_enter) { + sqlite3_mutex_enter(sqlite3_db_mutex(p->db)); + entered = 1; + } +#endif + sqlite3_bind_int64(p->stmtRowidsInsertRowid, 1, rowid); + rc = sqlite3_step(p->stmtRowidsInsertRowid); + + if (rc != SQLITE_DONE) { + if (sqlite3_extended_errcode(p->db) == SQLITE_CONSTRAINT_PRIMARYKEY) { + // IMP: V17090_01160 + vtab_set_error(&p->base, "UNIQUE constraint failed on %s primary key", + p->tableName); + } else { + // IMP: V04679_21517 + vtab_set_error(&p->base, + "Error inserting rowid into rowids shadow table: %s", + sqlite3_errmsg(sqlite3_db_handle(p->stmtRowidsInsertId))); + } + rc = SQLITE_ERROR; + goto cleanup; + } + + rc = SQLITE_OK; + +cleanup: + if (p->stmtRowidsInsertRowid) { + sqlite3_reset(p->stmtRowidsInsertRowid); + sqlite3_clear_bindings(p->stmtRowidsInsertRowid); + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_leave && entered) { + sqlite3_mutex_leave(sqlite3_db_mutex(p->db)); + } +#endif + return rc; +} + +int vec0_rowids_insert_id(vec0_vtab *p, sqlite3_value *idValue, i64 *rowid) { + int rc = SQLITE_OK; + int entered = 0; + UNUSED_PARAMETER(entered); // temporary + if (!p->stmtRowidsInsertId) { + const char *zSql = + sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_ROWIDS_NAME "(id)" + "VALUES (?);", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto complete; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtRowidsInsertId, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "could not initialize 'insert rowids id' statement"); + goto complete; + } + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_enter) { + sqlite3_mutex_enter(sqlite3_db_mutex(p->db)); + entered = 1; + } +#endif + + if (idValue) { + sqlite3_bind_value(p->stmtRowidsInsertId, 1, idValue); + } + rc = sqlite3_step(p->stmtRowidsInsertId); + + if (rc != SQLITE_DONE) { + if (sqlite3_extended_errcode(p->db) == SQLITE_CONSTRAINT_UNIQUE) { + // IMP: V20497_04568 + vtab_set_error(&p->base, "UNIQUE constraint failed on %s primary key", + p->tableName); + } else { + // IMP: V24016_08086 + // IMP: V15177_32015 + vtab_set_error(&p->base, + "Error inserting id into rowids shadow table: %s", + sqlite3_errmsg(sqlite3_db_handle(p->stmtRowidsInsertId))); + } + rc = SQLITE_ERROR; + goto complete; + } + + *rowid = sqlite3_last_insert_rowid(p->db); + rc = SQLITE_OK; + +complete: + if (p->stmtRowidsInsertId) { + sqlite3_reset(p->stmtRowidsInsertId); + sqlite3_clear_bindings(p->stmtRowidsInsertId); + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_leave && entered) { + sqlite3_mutex_leave(sqlite3_db_mutex(p->db)); + } +#endif + return rc; +} + +int vec0_metadata_chunk_size(vec0_metadata_column_kind kind, int chunk_size) { + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: + return chunk_size / 8; + case VEC0_METADATA_COLUMN_KIND_INTEGER: + return chunk_size * sizeof(i64); + case VEC0_METADATA_COLUMN_KIND_FLOAT: + return chunk_size * sizeof(double); + case VEC0_METADATA_COLUMN_KIND_TEXT: + return chunk_size * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH; + } + return 0; +} + +int vec0_rowids_update_position(vec0_vtab *p, i64 rowid, i64 chunk_rowid, + i64 chunk_offset) { + int rc = SQLITE_OK; + + if (!p->stmtRowidsUpdatePosition) { + const char *zSql = sqlite3_mprintf(" UPDATE " VEC0_SHADOW_ROWIDS_NAME + " SET chunk_id = ?, chunk_offset = ?" + " WHERE rowid = ?", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtRowidsUpdatePosition, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "could not initialize 'update rowids position' statement"); + goto cleanup; + } + } + + sqlite3_bind_int64(p->stmtRowidsUpdatePosition, 1, chunk_rowid); + sqlite3_bind_int64(p->stmtRowidsUpdatePosition, 2, chunk_offset); + sqlite3_bind_int64(p->stmtRowidsUpdatePosition, 3, rowid); + + rc = sqlite3_step(p->stmtRowidsUpdatePosition); + if (rc != SQLITE_DONE) { + // IMP: V21925_05995 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not update rowids position for rowid=%lld, " + "chunk_rowid=%lld, chunk_offset=%lld", + rowid, chunk_rowid, chunk_offset); + rc = SQLITE_ERROR; + goto cleanup; + } + rc = SQLITE_OK; + +cleanup: + if (p->stmtRowidsUpdatePosition) { + sqlite3_reset(p->stmtRowidsUpdatePosition); + sqlite3_clear_bindings(p->stmtRowidsUpdatePosition); + } + + return rc; +} + +/** + * @brief Adds a new chunk for the vec0 table, and the corresponding vector + * chunks. + * + * Inserts a new row into the _chunks table, with blank data, and uses that new + * rowid to insert new blank rows into _vector_chunksXX tables. + * + * @param p: vec0 table to add new chunk + * @param paritionKeyValues: Array of partition key valeus for the new chunk, if available + * @param chunk_rowid: Output pointer, if not NULL, then will be filled with the + * new chunk rowid. + * @return int SQLITE_OK on success, error code otherwise. + */ +int vec0_new_chunk(vec0_vtab *p, sqlite3_value ** partitionKeyValues, i64 *chunk_rowid) { + int rc; + char *zSql; + sqlite3_stmt *stmt; + i64 rowid; + + // Step 1: Insert a new row in _chunks, capture that new rowid + if(p->numPartitionColumns > 0) { + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "INSERT INTO " VEC0_SHADOW_CHUNKS_NAME, p->schemaName, p->tableName); + sqlite3_str_appendall(s, "(size, validity, rowids"); + for(int i = 0; i < p->numPartitionColumns; i++) { + sqlite3_str_appendf(s, ", partition%02d", i); + } + sqlite3_str_appendall(s, ") VALUES (?, ?, ?"); + for(int i = 0; i < p->numPartitionColumns; i++) { + sqlite3_str_appendall(s, ", ?"); + } + sqlite3_str_appendall(s, ")"); + + zSql = sqlite3_str_finish(s); + }else { + zSql = sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_CHUNKS_NAME + "(size, validity, rowids) " + "VALUES (?, ?, ?);", + p->schemaName, p->tableName); + } + + if (!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return rc; + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_enter) { + sqlite3_mutex_enter(sqlite3_db_mutex(p->db)); + } +#endif + + sqlite3_bind_int64(stmt, 1, p->chunk_size); // size + sqlite3_bind_zeroblob(stmt, 2, p->chunk_size / CHAR_BIT); // validity bitmap + sqlite3_bind_zeroblob(stmt, 3, p->chunk_size * sizeof(i64)); // rowids + + for(int i = 0; i < p->numPartitionColumns; i++) { + sqlite3_bind_value(stmt, 4 + i, partitionKeyValues[i]); + } + + rc = sqlite3_step(stmt); + int failed = rc != SQLITE_DONE; + rowid = sqlite3_last_insert_rowid(p->db); +#if SQLITE_THREADSAFE + if (sqlite3_mutex_leave) { + sqlite3_mutex_leave(sqlite3_db_mutex(p->db)); + } +#endif + sqlite3_finalize(stmt); + if (failed) { + return SQLITE_ERROR; + } + + // Step 2: Create new vector chunks for each vector column, with + // that new chunk_rowid. + + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_VECTOR) { + continue; + } + int vector_column_idx = p->user_column_idxs[i]; + i64 vectorsSize = + p->chunk_size * vector_column_byte_size(p->vector_columns[vector_column_idx]); + + zSql = sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_VECTOR_N_NAME + "(rowid, vectors)" + "VALUES (?, ?)", + p->schemaName, p->tableName, vector_column_idx); + if (!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + + if (rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return rc; + } + + sqlite3_bind_int64(stmt, 1, rowid); + sqlite3_bind_zeroblob64(stmt, 2, vectorsSize); + + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + if (rc != SQLITE_DONE) { + return rc; + } + } + + // Step 3: Create new metadata chunks for each metadata column + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_METADATA) { + continue; + } + int metadata_column_idx = p->user_column_idxs[i]; + zSql = sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_METADATA_N_NAME + "(rowid, data)" + "VALUES (?, ?)", + p->schemaName, p->tableName, metadata_column_idx); + if (!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + + if (rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return rc; + } + + sqlite3_bind_int64(stmt, 1, rowid); + sqlite3_bind_zeroblob64(stmt, 2, vec0_metadata_chunk_size(p->metadata_columns[metadata_column_idx].kind, p->chunk_size)); + + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + if (rc != SQLITE_DONE) { + return rc; + } + } + + + if (chunk_rowid) { + *chunk_rowid = rowid; + } + + return SQLITE_OK; +} + +struct vec0_query_fullscan_data { + sqlite3_stmt *rowids_stmt; + i8 done; +}; +void vec0_query_fullscan_data_clear( + struct vec0_query_fullscan_data *fullscan_data) { + if (!fullscan_data) + return; + + if (fullscan_data->rowids_stmt) { + sqlite3_finalize(fullscan_data->rowids_stmt); + fullscan_data->rowids_stmt = NULL; + } +} + +struct vec0_query_knn_data { + i64 k; + i64 k_used; + // Array of rowids of size k. Must be freed with sqlite3_free(). + i64 *rowids; + // Array of distances of size k. Must be freed with sqlite3_free(). + f32 *distances; + i64 current_idx; +}; +void vec0_query_knn_data_clear(struct vec0_query_knn_data *knn_data) { + if (!knn_data) + return; + + if (knn_data->rowids) { + sqlite3_free(knn_data->rowids); + knn_data->rowids = NULL; + } + if (knn_data->distances) { + sqlite3_free(knn_data->distances); + knn_data->distances = NULL; + } +} + +struct vec0_query_point_data { + i64 rowid; + void *vectors[VEC0_MAX_VECTOR_COLUMNS]; + int done; +}; +void vec0_query_point_data_clear(struct vec0_query_point_data *point_data) { + if (!point_data) + return; + for (int i = 0; i < VEC0_MAX_VECTOR_COLUMNS; i++) { + sqlite3_free(point_data->vectors[i]); + point_data->vectors[i] = NULL; + } +} + +typedef enum { + // If any values are updated, please update the ARCHITECTURE.md docs accordingly! + + VEC0_QUERY_PLAN_FULLSCAN = '1', + VEC0_QUERY_PLAN_POINT = '2', + VEC0_QUERY_PLAN_KNN = '3', +} vec0_query_plan; + +typedef struct vec0_cursor vec0_cursor; +struct vec0_cursor { + sqlite3_vtab_cursor base; + + vec0_query_plan query_plan; + struct vec0_query_fullscan_data *fullscan_data; + struct vec0_query_knn_data *knn_data; + struct vec0_query_point_data *point_data; +}; + +void vec0_cursor_clear(vec0_cursor *pCur) { + if (pCur->fullscan_data) { + vec0_query_fullscan_data_clear(pCur->fullscan_data); + sqlite3_free(pCur->fullscan_data); + pCur->fullscan_data = NULL; + } + if (pCur->knn_data) { + vec0_query_knn_data_clear(pCur->knn_data); + sqlite3_free(pCur->knn_data); + pCur->knn_data = NULL; + } + if (pCur->point_data) { + vec0_query_point_data_clear(pCur->point_data); + sqlite3_free(pCur->point_data); + pCur->point_data = NULL; + } +} + +#define VEC_CONSTRUCTOR_ERROR "vec0 constructor error: " +static int vec0_init(sqlite3 *db, void *pAux, int argc, const char *const *argv, + sqlite3_vtab **ppVtab, char **pzErr, bool isCreate) { + UNUSED_PARAMETER(pAux); + vec0_vtab *pNew; + int rc; + const char *zSql; + + pNew = sqlite3_malloc(sizeof(*pNew)); + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + + // Declared chunk_size=N for entire table. + // -1 to use the defualt, otherwise will get re-assigned on `chunk_size=N` + // option + int chunk_size = -1; + int numVectorColumns = 0; + int numPartitionColumns = 0; + int numAuxiliaryColumns = 0; + int numMetadataColumns = 0; + int user_column_idx = 0; + + // track if a "primary key" column is defined + char *pkColumnName = NULL; + int pkColumnNameLength; + int pkColumnType = SQLITE_INTEGER; + + for (int i = 3; i < argc; i++) { + struct VectorColumnDefinition vecColumn; + struct Vec0PartitionColumnDefinition partitionColumn; + struct Vec0AuxiliaryColumnDefinition auxColumn; + struct Vec0MetadataColumnDefinition metadataColumn; + char *cName = NULL; + int cNameLength; + int cType; + + // Scenario #1: Constructor argument is a vector column definition, ie `foo float[1024]` + rc = vec0_parse_vector_column(argv[i], strlen(argv[i]), &vecColumn); + if (rc == SQLITE_ERROR) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR "could not parse vector column '%s'", argv[i]); + goto error; + } + if (rc == SQLITE_OK) { + if (numVectorColumns >= VEC0_MAX_VECTOR_COLUMNS) { + sqlite3_free(vecColumn.name); + *pzErr = sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "Too many provided vector columns, maximum %d", + VEC0_MAX_VECTOR_COLUMNS); + goto error; + } + + if (vecColumn.dimensions > SQLITE_VEC_VEC0_MAX_DIMENSIONS) { + sqlite3_free(vecColumn.name); + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "Dimension on vector column too large, provided %lld, maximum %lld", + (i64)vecColumn.dimensions, SQLITE_VEC_VEC0_MAX_DIMENSIONS); + goto error; + } + pNew->user_column_kinds[user_column_idx] = SQLITE_VEC0_USER_COLUMN_KIND_VECTOR; + pNew->user_column_idxs[user_column_idx] = numVectorColumns; + memcpy(&pNew->vector_columns[numVectorColumns], &vecColumn, sizeof(vecColumn)); + numVectorColumns++; + user_column_idx++; + + continue; + } + + // Scenario #2: Constructor argument is a partition key column definition, ie `user_id text partition key` + rc = vec0_parse_partition_key_definition(argv[i], strlen(argv[i]), &cName, + &cNameLength, &cType); + if (rc == SQLITE_OK) { + if (numPartitionColumns >= VEC0_MAX_PARTITION_COLUMNS) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "More than %d partition key columns were provided", + VEC0_MAX_PARTITION_COLUMNS); + goto error; + } + partitionColumn.type = cType; + partitionColumn.name_length = cNameLength; + partitionColumn.name = sqlite3_mprintf("%.*s", cNameLength, cName); + if(!partitionColumn.name) { + rc = SQLITE_NOMEM; + goto error; + } + + pNew->user_column_kinds[user_column_idx] = SQLITE_VEC0_USER_COLUMN_KIND_PARTITION; + pNew->user_column_idxs[user_column_idx] = numPartitionColumns; + memcpy(&pNew->paritition_columns[numPartitionColumns], &partitionColumn, sizeof(partitionColumn)); + numPartitionColumns++; + user_column_idx++; + continue; + } + + // Scenario #3: Constructor argument is a primary key column definition, ie `article_id text primary key` + rc = vec0_parse_primary_key_definition(argv[i], strlen(argv[i]), &cName, + &cNameLength, &cType); + if (rc == SQLITE_OK) { + if (pkColumnName) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "More than one primary key definition was provided, vec0 only " + "suports a single primary key column", + argv[i]); + goto error; + } + pkColumnName = cName; + pkColumnNameLength = cNameLength; + pkColumnType = cType; + continue; + } + + // Scenario #4: Constructor argument is a auxiliary column definition, ie `+contents text` + rc = vec0_parse_auxiliary_column_definition(argv[i], strlen(argv[i]), &cName, + &cNameLength, &cType); + if(rc == SQLITE_OK) { + if (numAuxiliaryColumns >= VEC0_MAX_AUXILIARY_COLUMNS) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "More than %d auxiliary columns were provided", + VEC0_MAX_AUXILIARY_COLUMNS); + goto error; + } + auxColumn.type = cType; + auxColumn.name_length = cNameLength; + auxColumn.name = sqlite3_mprintf("%.*s", cNameLength, cName); + if(!auxColumn.name) { + rc = SQLITE_NOMEM; + goto error; + } + + pNew->user_column_kinds[user_column_idx] = SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY; + pNew->user_column_idxs[user_column_idx] = numAuxiliaryColumns; + memcpy(&pNew->auxiliary_columns[numAuxiliaryColumns], &auxColumn, sizeof(auxColumn)); + numAuxiliaryColumns++; + user_column_idx++; + continue; + } + + vec0_metadata_column_kind kind; + rc = vec0_parse_metadata_column_definition(argv[i], strlen(argv[i]), &cName, + &cNameLength, &kind); + if(rc == SQLITE_OK) { + if (numMetadataColumns >= VEC0_MAX_METADATA_COLUMNS) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "More than %d metadata columns were provided", + VEC0_MAX_METADATA_COLUMNS); + goto error; + } + metadataColumn.kind = kind; + metadataColumn.name_length = cNameLength; + metadataColumn.name = sqlite3_mprintf("%.*s", cNameLength, cName); + if(!metadataColumn.name) { + rc = SQLITE_NOMEM; + goto error; + } + + pNew->user_column_kinds[user_column_idx] = SQLITE_VEC0_USER_COLUMN_KIND_METADATA; + pNew->user_column_idxs[user_column_idx] = numMetadataColumns; + memcpy(&pNew->metadata_columns[numMetadataColumns], &metadataColumn, sizeof(metadataColumn)); + numMetadataColumns++; + user_column_idx++; + continue; + } + + // Scenario #4: Constructor argument is a table-level option, ie `chunk_size` + + char *key; + char *value; + int keyLength, valueLength; + rc = vec0_parse_table_option(argv[i], strlen(argv[i]), &key, &keyLength, + &value, &valueLength); + if (rc == SQLITE_ERROR) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR "could not parse table option '%s'", argv[i]); + goto error; + } + if (rc == SQLITE_OK) { + if (sqlite3_strnicmp(key, "chunk_size", keyLength) == 0) { + chunk_size = atoi(value); + if (chunk_size <= 0) { + // IMP: V01931_18769 + *pzErr = + sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "chunk_size must be a non-zero positive integer"); + goto error; + } + if ((chunk_size % 8) != 0) { + // IMP: V14110_30948 + *pzErr = sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "chunk_size must be divisible by 8"); + goto error; + } +#define SQLITE_VEC_CHUNK_SIZE_MAX 4096 + if (chunk_size > SQLITE_VEC_CHUNK_SIZE_MAX) { + *pzErr = + sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR "chunk_size too large"); + goto error; + } + } else { + // IMP: V27642_11712 + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR "Unknown table option: %.*s", keyLength, key); + goto error; + } + continue; + } + + // Scenario #5: Unknown constructor argument + *pzErr = + sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR "Could not parse '%s'", argv[i]); + goto error; + } + + if (chunk_size < 0) { + chunk_size = 1024; + } + + if (numVectorColumns <= 0) { + *pzErr = sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "At least one vector column is required"); + goto error; + } + + sqlite3_str *createStr = sqlite3_str_new(NULL); + sqlite3_str_appendall(createStr, "CREATE TABLE x("); + if (pkColumnName) { + sqlite3_str_appendf(createStr, "\"%.*w\" primary key, ", pkColumnNameLength, + pkColumnName); + } else { + sqlite3_str_appendall(createStr, "rowid, "); + } + for (int i = 0; i < numVectorColumns + numPartitionColumns + numAuxiliaryColumns + numMetadataColumns; i++) { + switch(pNew->user_column_kinds[i]) { + case SQLITE_VEC0_USER_COLUMN_KIND_VECTOR: { + int vector_idx = pNew->user_column_idxs[i]; + sqlite3_str_appendf(createStr, "\"%.*w\", ", + pNew->vector_columns[vector_idx].name_length, + pNew->vector_columns[vector_idx].name); + break; + } + case SQLITE_VEC0_USER_COLUMN_KIND_PARTITION: { + int partition_idx = pNew->user_column_idxs[i]; + sqlite3_str_appendf(createStr, "\"%.*w\", ", + pNew->paritition_columns[partition_idx].name_length, + pNew->paritition_columns[partition_idx].name); + break; + } + case SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY: { + int auxiliary_idx = pNew->user_column_idxs[i]; + sqlite3_str_appendf(createStr, "\"%.*w\", ", + pNew->auxiliary_columns[auxiliary_idx].name_length, + pNew->auxiliary_columns[auxiliary_idx].name); + break; + } + case SQLITE_VEC0_USER_COLUMN_KIND_METADATA: { + int metadata_idx = pNew->user_column_idxs[i]; + sqlite3_str_appendf(createStr, "\"%.*w\", ", + pNew->metadata_columns[metadata_idx].name_length, + pNew->metadata_columns[metadata_idx].name); + break; + } + } + + } + sqlite3_str_appendall(createStr, " distance hidden, k hidden) "); + if (pkColumnName) { + sqlite3_str_appendall(createStr, "without rowid "); + } + zSql = sqlite3_str_finish(createStr); + if (!zSql) { + goto error; + } + rc = sqlite3_declare_vtab(db, zSql); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + *pzErr = sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "could not declare virtual table, '%s'", + sqlite3_errmsg(db)); + goto error; + } + + const char *schemaName = argv[1]; + const char *tableName = argv[2]; + + pNew->db = db; + pNew->pkIsText = pkColumnType == SQLITE_TEXT; + pNew->schemaName = sqlite3_mprintf("%s", schemaName); + if (!pNew->schemaName) { + goto error; + } + pNew->tableName = sqlite3_mprintf("%s", tableName); + if (!pNew->tableName) { + goto error; + } + pNew->shadowRowidsName = sqlite3_mprintf("%s_rowids", tableName); + if (!pNew->shadowRowidsName) { + goto error; + } + pNew->shadowChunksName = sqlite3_mprintf("%s_chunks", tableName); + if (!pNew->shadowChunksName) { + goto error; + } + pNew->numVectorColumns = numVectorColumns; + pNew->numPartitionColumns = numPartitionColumns; + pNew->numAuxiliaryColumns = numAuxiliaryColumns; + pNew->numMetadataColumns = numMetadataColumns; + + for (int i = 0; i < pNew->numVectorColumns; i++) { + pNew->shadowVectorChunksNames[i] = + sqlite3_mprintf("%s_vector_chunks%02d", tableName, i); + if (!pNew->shadowVectorChunksNames[i]) { + goto error; + } + } + for (int i = 0; i < pNew->numMetadataColumns; i++) { + pNew->shadowMetadataChunksNames[i] = + sqlite3_mprintf("%s_metadatachunks%02d", tableName, i); + if (!pNew->shadowMetadataChunksNames[i]) { + goto error; + } + } + pNew->chunk_size = chunk_size; + + // if xCreate, then create the necessary shadow tables + if (isCreate) { + sqlite3_stmt *stmt; + int rc; + + char * zCreateInfo = sqlite3_mprintf("CREATE TABLE "VEC0_SHADOW_INFO_NAME " (key text primary key, value any)", pNew->schemaName, pNew->tableName); + if(!zCreateInfo) { + goto error; + } + rc = sqlite3_prepare_v2(db, zCreateInfo, -1, &stmt, NULL); + + sqlite3_free((void *) zCreateInfo); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + // TODO(IMP) + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not create '_info' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + char * zSeedInfo = sqlite3_mprintf( + "INSERT INTO "VEC0_SHADOW_INFO_NAME "(key, value) VALUES " + "(?1, ?2), (?3, ?4), (?5, ?6), (?7, ?8) ", + pNew->schemaName, pNew->tableName + ); + if(!zSeedInfo) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSeedInfo, -1, &stmt, NULL); + sqlite3_free((void *) zSeedInfo); + if (rc != SQLITE_OK) { + // TODO(IMP) + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not seed '_info' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_bind_text(stmt, 1, "CREATE_VERSION", -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 2, SQLITE_VEC_VERSION, -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 3, "CREATE_VERSION_MAJOR", -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 4, SQLITE_VEC_VERSION_MAJOR); + sqlite3_bind_text(stmt, 5, "CREATE_VERSION_MINOR", -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 6, SQLITE_VEC_VERSION_MINOR); + sqlite3_bind_text(stmt, 7, "CREATE_VERSION_PATCH", -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 8, SQLITE_VEC_VERSION_PATCH); + + if(sqlite3_step(stmt) != SQLITE_DONE) { + // TODO(IMP) + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not seed '_info' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + + + // create the _chunks shadow table + char *zCreateShadowChunks = NULL; + if(pNew->numPartitionColumns) { + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "CREATE TABLE " VEC0_SHADOW_CHUNKS_NAME "(", pNew->schemaName, pNew->tableName); + sqlite3_str_appendall(s, "chunk_id INTEGER PRIMARY KEY AUTOINCREMENT," "size INTEGER NOT NULL,"); + sqlite3_str_appendall(s, "sequence_id integer,"); + for(int i = 0; i < pNew->numPartitionColumns;i++) { + sqlite3_str_appendf(s, "partition%02d,", i); + } + sqlite3_str_appendall(s, "validity BLOB NOT NULL, rowids BLOB NOT NULL);"); + zCreateShadowChunks = sqlite3_str_finish(s); + }else { + zCreateShadowChunks = sqlite3_mprintf(VEC0_SHADOW_CHUNKS_CREATE, + pNew->schemaName, pNew->tableName); + } + if (!zCreateShadowChunks) { + goto error; + } + rc = sqlite3_prepare_v2(db, zCreateShadowChunks, -1, &stmt, 0); + sqlite3_free((void *)zCreateShadowChunks); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + // IMP: V17740_01811 + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not create '_chunks' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + // create the _rowids shadow table + char *zCreateShadowRowids; + if (pNew->pkIsText) { + // adds a "text unique not null" constraint to the id column + zCreateShadowRowids = sqlite3_mprintf(VEC0_SHADOW_ROWIDS_CREATE_PK_TEXT, + pNew->schemaName, pNew->tableName); + } else { + zCreateShadowRowids = sqlite3_mprintf(VEC0_SHADOW_ROWIDS_CREATE_BASIC, + pNew->schemaName, pNew->tableName); + } + if (!zCreateShadowRowids) { + goto error; + } + rc = sqlite3_prepare_v2(db, zCreateShadowRowids, -1, &stmt, 0); + sqlite3_free((void *)zCreateShadowRowids); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + // IMP: V11631_28470 + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not create '_rowids' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + for (int i = 0; i < pNew->numVectorColumns; i++) { + char *zSql = sqlite3_mprintf(VEC0_SHADOW_VECTOR_N_CREATE, + pNew->schemaName, pNew->tableName, i); + if (!zSql) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + // IMP: V25919_09989 + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf( + "Could not create '_vector_chunks%02d' shadow table: %s", i, + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + } + + for (int i = 0; i < pNew->numMetadataColumns; i++) { + char *zSql = sqlite3_mprintf("CREATE TABLE " VEC0_SHADOW_METADATA_N_NAME "(rowid PRIMARY KEY, data BLOB NOT NULL);", + pNew->schemaName, pNew->tableName, i); + if (!zSql) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf( + "Could not create '_metata_chunks%02d' shadow table: %s", i, + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + if(pNew->metadata_columns[i].kind == VEC0_METADATA_COLUMN_KIND_TEXT) { + char *zSql = sqlite3_mprintf("CREATE TABLE " VEC0_SHADOW_METADATA_TEXT_DATA_NAME "(rowid PRIMARY KEY, data TEXT);", + pNew->schemaName, pNew->tableName, i); + if (!zSql) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf( + "Could not create '_metadatatext%02d' shadow table: %s", i, + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + } + } + + if(pNew->numAuxiliaryColumns > 0) { + sqlite3_stmt * stmt; + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "CREATE TABLE " VEC0_SHADOW_AUXILIARY_NAME "( rowid integer PRIMARY KEY ", pNew->schemaName, pNew->tableName); + for(int i = 0; i < pNew->numAuxiliaryColumns; i++) { + sqlite3_str_appendf(s, ", value%02d", i); + } + sqlite3_str_appendall(s, ")"); + char *zSql = sqlite3_str_finish(s); + if(!zSql) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, NULL); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf( + "Could not create auxiliary shadow table: %s", + sqlite3_errmsg(db)); + + goto error; + } + sqlite3_finalize(stmt); + } + } + + *ppVtab = (sqlite3_vtab *)pNew; + return SQLITE_OK; + +error: + vec0_free(pNew); + return SQLITE_ERROR; +} + +static int vec0Create(sqlite3 *db, void *pAux, int argc, + const char *const *argv, sqlite3_vtab **ppVtab, + char **pzErr) { + return vec0_init(db, pAux, argc, argv, ppVtab, pzErr, true); +} +static int vec0Connect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, sqlite3_vtab **ppVtab, + char **pzErr) { + return vec0_init(db, pAux, argc, argv, ppVtab, pzErr, false); +} + +static int vec0Disconnect(sqlite3_vtab *pVtab) { + vec0_vtab *p = (vec0_vtab *)pVtab; + vec0_free(p); + sqlite3_free(p); + return SQLITE_OK; +} +static int vec0Destroy(sqlite3_vtab *pVtab) { + vec0_vtab *p = (vec0_vtab *)pVtab; + sqlite3_stmt *stmt; + int rc; + const char *zSql; + + // Free up any sqlite3_stmt, otherwise DROPs on those tables will fail + vec0_free_resources(p); + + // TODO(test) later: can't evidence-of here, bc always gives "SQL logic error" instead of + // provided error + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_CHUNKS_NAME, p->schemaName, + p->tableName); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + vtab_set_error(pVtab, "could not drop chunks shadow table"); + goto done; + } + sqlite3_finalize(stmt); + + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_INFO_NAME, p->schemaName, + p->tableName); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + vtab_set_error(pVtab, "could not drop info shadow table"); + goto done; + } + sqlite3_finalize(stmt); + + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_ROWIDS_NAME, p->schemaName, + p->tableName); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + + for (int i = 0; i < p->numVectorColumns; i++) { + zSql = sqlite3_mprintf("DROP TABLE \"%w\".\"%w\"", p->schemaName, + p->shadowVectorChunksNames[i]); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + } + + if(p->numAuxiliaryColumns > 0) { + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_AUXILIARY_NAME, p->schemaName, p->tableName); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + } + + + for (int i = 0; i < p->numMetadataColumns; i++) { + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_METADATA_N_NAME, p->schemaName,p->tableName, i); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + + if(p->metadata_columns[i].kind == VEC0_METADATA_COLUMN_KIND_TEXT) { + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_METADATA_TEXT_DATA_NAME, p->schemaName,p->tableName, i); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + } + } + + stmt = NULL; + rc = SQLITE_OK; + +done: + sqlite3_finalize(stmt); + vec0_free(p); + // If there was an error + if (rc == SQLITE_OK) { + sqlite3_free(p); + } + return rc; +} + +static int vec0Open(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec0_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec0Close(sqlite3_vtab_cursor *cur) { + vec0_cursor *pCur = (vec0_cursor *)cur; + vec0_cursor_clear(pCur); + sqlite3_free(pCur); + return SQLITE_OK; +} + +// All the different type of "values" provided to argv/argc in vec0Filter. +// These enums denote the use and purpose of all of them. +typedef enum { + // If any values are updated, please update the ARCHITECTURE.md docs accordingly! + + VEC0_IDXSTR_KIND_KNN_MATCH = '{', + VEC0_IDXSTR_KIND_KNN_K = '}', + VEC0_IDXSTR_KIND_KNN_ROWID_IN = '[', + VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT = ']', + VEC0_IDXSTR_KIND_POINT_ID = '!', + VEC0_IDXSTR_KIND_METADATA_CONSTRAINT = '&', +} vec0_idxstr_kind; + +// The different SQLITE_INDEX_CONSTRAINT values that vec0 partition key columns +// support, but as characters that fit nicely in idxstr. +typedef enum { + // If any values are updated, please update the ARCHITECTURE.md docs accordingly! + + VEC0_PARTITION_OPERATOR_EQ = 'a', + VEC0_PARTITION_OPERATOR_GT = 'b', + VEC0_PARTITION_OPERATOR_LE = 'c', + VEC0_PARTITION_OPERATOR_LT = 'd', + VEC0_PARTITION_OPERATOR_GE = 'e', + VEC0_PARTITION_OPERATOR_NE = 'f', +} vec0_partition_operator; +typedef enum { + VEC0_METADATA_OPERATOR_EQ = 'a', + VEC0_METADATA_OPERATOR_GT = 'b', + VEC0_METADATA_OPERATOR_LE = 'c', + VEC0_METADATA_OPERATOR_LT = 'd', + VEC0_METADATA_OPERATOR_GE = 'e', + VEC0_METADATA_OPERATOR_NE = 'f', + VEC0_METADATA_OPERATOR_IN = 'g', +} vec0_metadata_operator; + +static int vec0BestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pIdxInfo) { + vec0_vtab *p = (vec0_vtab *)pVTab; + /** + * Possible query plans are: + * 1. KNN when: + * a) An `MATCH` op on vector column + * b) ORDER BY on distance column + * c) LIMIT + * d) rowid in (...) OPTIONAL + * 2. Point when: + * a) An `EQ` op on rowid column + * 3. else: fullscan + * + */ + int iMatchTerm = -1; + int iMatchVectorTerm = -1; + int iLimitTerm = -1; + int iRowidTerm = -1; + int iKTerm = -1; + int iRowidInTerm = -1; + int hasAuxConstraint = 0; + +#ifdef SQLITE_VEC_DEBUG + printf("pIdxInfo->nOrderBy=%d, pIdxInfo->nConstraint=%d\n", pIdxInfo->nOrderBy, pIdxInfo->nConstraint); +#endif + + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + u8 vtabIn = 0; + +#if COMPILER_SUPPORTS_VTAB_IN + if (sqlite3_libversion_number() >= 3038000) { + vtabIn = sqlite3_vtab_in(pIdxInfo, i, -1); + } +#endif + +#ifdef SQLITE_VEC_DEBUG + printf("xBestIndex [%d] usable=%d iColumn=%d op=%d vtabin=%d\n", i, + pIdxInfo->aConstraint[i].usable, pIdxInfo->aConstraint[i].iColumn, + pIdxInfo->aConstraint[i].op, vtabIn); +#endif + if (!pIdxInfo->aConstraint[i].usable) + continue; + + int iColumn = pIdxInfo->aConstraint[i].iColumn; + int op = pIdxInfo->aConstraint[i].op; + + if (op == SQLITE_INDEX_CONSTRAINT_LIMIT) { + iLimitTerm = i; + } + if (op == SQLITE_INDEX_CONSTRAINT_MATCH && + vec0_column_idx_is_vector(p, iColumn)) { + if (iMatchTerm > -1) { + vtab_set_error( + pVTab, "only 1 MATCH operator is allowed in a single vec0 query"); + return SQLITE_ERROR; + } + iMatchTerm = i; + iMatchVectorTerm = vec0_column_idx_to_vector_idx(p, iColumn); + } + if (op == SQLITE_INDEX_CONSTRAINT_EQ && iColumn == VEC0_COLUMN_ID) { + if (vtabIn) { + if (iRowidInTerm != -1) { + vtab_set_error(pVTab, "only 1 'rowid in (..)' operator is allowed in " + "a single vec0 query"); + return SQLITE_ERROR; + } + iRowidInTerm = i; + + } else { + iRowidTerm = i; + } + } + if (op == SQLITE_INDEX_CONSTRAINT_EQ && iColumn == vec0_column_k_idx(p)) { + iKTerm = i; + } + if( + (op != SQLITE_INDEX_CONSTRAINT_LIMIT && op != SQLITE_INDEX_CONSTRAINT_OFFSET) + && vec0_column_idx_is_auxiliary(p, iColumn)) { + hasAuxConstraint = 1; + } + } + + sqlite3_str *idxStr = sqlite3_str_new(NULL); + int rc; + + if (iMatchTerm >= 0) { + if (iLimitTerm < 0 && iKTerm < 0) { + vtab_set_error( + pVTab, + "A LIMIT or 'k = ?' constraint is required on vec0 knn queries."); + rc = SQLITE_ERROR; + goto done; + } + if (iLimitTerm >= 0 && iKTerm >= 0) { + vtab_set_error(pVTab, "Only LIMIT or 'k =?' can be provided, not both"); + rc = SQLITE_ERROR; + goto done; + } + + if (pIdxInfo->nOrderBy) { + if (pIdxInfo->nOrderBy > 1) { + vtab_set_error(pVTab, "Only a single 'ORDER BY distance' clause is " + "allowed on vec0 KNN queries"); + rc = SQLITE_ERROR; + goto done; + } + if (pIdxInfo->aOrderBy[0].iColumn != vec0_column_distance_idx(p)) { + vtab_set_error(pVTab, + "Only a single 'ORDER BY distance' clause is allowed on " + "vec0 KNN queries, not on other columns"); + rc = SQLITE_ERROR; + goto done; + } + if (pIdxInfo->aOrderBy[0].desc) { + vtab_set_error( + pVTab, "Only ascending in ORDER BY distance clause is supported, " + "DESC is not supported yet."); + rc = SQLITE_ERROR; + goto done; + } + } + + if(hasAuxConstraint) { + // IMP: V25623_09693 + vtab_set_error(pVTab, "An illegal WHERE constraint was provided on a vec0 auxiliary column in a KNN query."); + rc = SQLITE_ERROR; + goto done; + } + + sqlite3_str_appendchar(idxStr, 1, VEC0_QUERY_PLAN_KNN); + + int argvIndex = 1; + pIdxInfo->aConstraintUsage[iMatchTerm].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[iMatchTerm].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_KNN_MATCH); + sqlite3_str_appendchar(idxStr, 3, '_'); + + if (iLimitTerm >= 0) { + pIdxInfo->aConstraintUsage[iLimitTerm].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[iLimitTerm].omit = 1; + } else { + pIdxInfo->aConstraintUsage[iKTerm].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[iKTerm].omit = 1; + } + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_KNN_K); + sqlite3_str_appendchar(idxStr, 3, '_'); + +#if COMPILER_SUPPORTS_VTAB_IN + if (iRowidInTerm >= 0) { + // already validated as >= SQLite 3.38 bc iRowidInTerm is only >= 0 when + // vtabIn == 1 + sqlite3_vtab_in(pIdxInfo, iRowidInTerm, 1); + pIdxInfo->aConstraintUsage[iRowidInTerm].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[iRowidInTerm].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_KNN_ROWID_IN); + sqlite3_str_appendchar(idxStr, 3, '_'); + } +#endif + + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + if (!pIdxInfo->aConstraint[i].usable) + continue; + + int iColumn = pIdxInfo->aConstraint[i].iColumn; + int op = pIdxInfo->aConstraint[i].op; + if(op == SQLITE_INDEX_CONSTRAINT_LIMIT || op == SQLITE_INDEX_CONSTRAINT_OFFSET) { + continue; + } + if(!vec0_column_idx_is_partition(p, iColumn)) { + continue; + } + + int partition_idx = vec0_column_idx_to_partition_idx(p, iColumn); + char value = 0; + + switch(op) { + case SQLITE_INDEX_CONSTRAINT_EQ: { + value = VEC0_PARTITION_OPERATOR_EQ; + break; + } + case SQLITE_INDEX_CONSTRAINT_GT: { + value = VEC0_PARTITION_OPERATOR_GT; + break; + } + case SQLITE_INDEX_CONSTRAINT_LE: { + value = VEC0_PARTITION_OPERATOR_LE; + break; + } + case SQLITE_INDEX_CONSTRAINT_LT: { + value = VEC0_PARTITION_OPERATOR_LT; + break; + } + case SQLITE_INDEX_CONSTRAINT_GE: { + value = VEC0_PARTITION_OPERATOR_GE; + break; + } + case SQLITE_INDEX_CONSTRAINT_NE: { + value = VEC0_PARTITION_OPERATOR_NE; + break; + } + } + + if(value) { + pIdxInfo->aConstraintUsage[i].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[i].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT); + sqlite3_str_appendchar(idxStr, 1, 'A' + partition_idx); + sqlite3_str_appendchar(idxStr, 1, value); + sqlite3_str_appendchar(idxStr, 1, '_'); + } + + } + + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + if (!pIdxInfo->aConstraint[i].usable) + continue; + + int iColumn = pIdxInfo->aConstraint[i].iColumn; + int op = pIdxInfo->aConstraint[i].op; + if(op == SQLITE_INDEX_CONSTRAINT_LIMIT || op == SQLITE_INDEX_CONSTRAINT_OFFSET) { + continue; + } + if(!vec0_column_idx_is_metadata(p, iColumn)) { + continue; + } + + int metadata_idx = vec0_column_idx_to_metadata_idx(p, iColumn); + char value = 0; + + switch(op) { + case SQLITE_INDEX_CONSTRAINT_EQ: { + int vtabIn = 0; + #if COMPILER_SUPPORTS_VTAB_IN + if (sqlite3_libversion_number() >= 3038000) { + vtabIn = sqlite3_vtab_in(pIdxInfo, i, -1); + } + if(vtabIn) { + switch(p->metadata_columns[metadata_idx].kind) { + case VEC0_METADATA_COLUMN_KIND_FLOAT: + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + // IMP: V15248_32086 + rc = SQLITE_ERROR; + vtab_set_error(pVTab, "'xxx in (...)' is only available on INTEGER or TEXT metadata columns."); + goto done; + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: + case VEC0_METADATA_COLUMN_KIND_TEXT: { + break; + } + } + value = VEC0_METADATA_OPERATOR_IN; + sqlite3_vtab_in(pIdxInfo, i, 1); + }else + #endif + { + value = VEC0_PARTITION_OPERATOR_EQ; + } + break; + } + case SQLITE_INDEX_CONSTRAINT_GT: { + value = VEC0_METADATA_OPERATOR_GT; + break; + } + case SQLITE_INDEX_CONSTRAINT_LE: { + value = VEC0_METADATA_OPERATOR_LE; + break; + } + case SQLITE_INDEX_CONSTRAINT_LT: { + value = VEC0_METADATA_OPERATOR_LT; + break; + } + case SQLITE_INDEX_CONSTRAINT_GE: { + value = VEC0_METADATA_OPERATOR_GE; + break; + } + case SQLITE_INDEX_CONSTRAINT_NE: { + value = VEC0_METADATA_OPERATOR_NE; + break; + } + default: { + // IMP: V16511_00582 + rc = SQLITE_ERROR; + vtab_set_error(pVTab, + "An illegal WHERE constraint was provided on a vec0 metadata column in a KNN query. " + "Only one of EQUALS, GREATER_THAN, LESS_THAN_OR_EQUAL, LESS_THAN, GREATER_THAN_OR_EQUAL, NOT_EQUALS is allowed." + ); + goto done; + } + } + + if(p->metadata_columns[metadata_idx].kind == VEC0_METADATA_COLUMN_KIND_BOOLEAN) { + if(!(value == VEC0_METADATA_OPERATOR_EQ || value == VEC0_METADATA_OPERATOR_NE)) { + // IMP: V10145_26984 + rc = SQLITE_ERROR; + vtab_set_error(pVTab, "ONLY EQUALS (=) or NOT_EQUALS (!=) operators are allowed on boolean metadata columns."); + goto done; + } + } + + pIdxInfo->aConstraintUsage[i].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[i].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_METADATA_CONSTRAINT); + sqlite3_str_appendchar(idxStr, 1, 'A' + metadata_idx); + sqlite3_str_appendchar(idxStr, 1, value); + sqlite3_str_appendchar(idxStr, 1, '_'); + + } + + + + pIdxInfo->idxNum = iMatchVectorTerm; + pIdxInfo->estimatedCost = 30.0; + pIdxInfo->estimatedRows = 10; + + } else if (iRowidTerm >= 0) { + sqlite3_str_appendchar(idxStr, 1, VEC0_QUERY_PLAN_POINT); + pIdxInfo->aConstraintUsage[iRowidTerm].argvIndex = 1; + pIdxInfo->aConstraintUsage[iRowidTerm].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_POINT_ID); + sqlite3_str_appendchar(idxStr, 3, '_'); + pIdxInfo->idxNum = pIdxInfo->colUsed; + pIdxInfo->estimatedCost = 10.0; + pIdxInfo->estimatedRows = 1; + } else { + sqlite3_str_appendchar(idxStr, 1, VEC0_QUERY_PLAN_FULLSCAN); + pIdxInfo->estimatedCost = 3000000.0; + pIdxInfo->estimatedRows = 100000; + } + pIdxInfo->idxStr = sqlite3_str_finish(idxStr); + idxStr = NULL; + if (!pIdxInfo->idxStr) { + rc = SQLITE_OK; + goto done; + } + pIdxInfo->needToFreeIdxStr = 1; + + + rc = SQLITE_OK; + + done: + if(idxStr) { + sqlite3_str_finish(idxStr); + } + return rc; +} + +// forward delcaration bc vec0Filter uses it +static int vec0Next(sqlite3_vtab_cursor *cur); + +void merge_sorted_lists(f32 *a, i64 *a_rowids, i64 a_length, f32 *b, + i64 *b_rowids, i32 *b_top_idxs, i64 b_length, f32 *out, + i64 *out_rowids, i64 out_length, i64 *out_used) { + // assert((a_length >= out_length) || (b_length >= out_length)); + i64 ptrA = 0; + i64 ptrB = 0; + for (int i = 0; i < out_length; i++) { + if ((ptrA >= a_length) && (ptrB >= b_length)) { + *out_used = i; + return; + } + if (ptrA >= a_length) { + out[i] = b[b_top_idxs[ptrB]]; + out_rowids[i] = b_rowids[b_top_idxs[ptrB]]; + ptrB++; + } else if (ptrB >= b_length) { + out[i] = a[ptrA]; + out_rowids[i] = a_rowids[ptrA]; + ptrA++; + } else { + if (a[ptrA] <= b[b_top_idxs[ptrB]]) { + out[i] = a[ptrA]; + out_rowids[i] = a_rowids[ptrA]; + ptrA++; + } else { + out[i] = b[b_top_idxs[ptrB]]; + out_rowids[i] = b_rowids[b_top_idxs[ptrB]]; + ptrB++; + } + } + } + + *out_used = out_length; +} + +u8 *bitmap_new(i32 n) { + assert(n % 8 == 0); + u8 *p = sqlite3_malloc(n * sizeof(u8) / CHAR_BIT); + if (p) { + memset(p, 0, n * sizeof(u8) / CHAR_BIT); + } + return p; +} +u8 *bitmap_new_from(i32 n, u8 *from) { + assert(n % 8 == 0); + u8 *p = sqlite3_malloc(n * sizeof(u8) / CHAR_BIT); + if (p) { + memcpy(p, from, n / CHAR_BIT); + } + return p; +} + +void bitmap_copy(u8 *base, u8 *from, i32 n) { + assert(n % 8 == 0); + memcpy(base, from, n / CHAR_BIT); +} + +void bitmap_and_inplace(u8 *base, u8 *other, i32 n) { + assert((n % 8) == 0); + for (int i = 0; i < n / CHAR_BIT; i++) { + base[i] = base[i] & other[i]; + } +} + +void bitmap_set(u8 *bitmap, i32 position, int value) { + if (value) { + bitmap[position / CHAR_BIT] |= 1 << (position % CHAR_BIT); + } else { + bitmap[position / CHAR_BIT] &= ~(1 << (position % CHAR_BIT)); + } +} + +int bitmap_get(u8 *bitmap, i32 position) { + return (((bitmap[position / CHAR_BIT]) >> (position % CHAR_BIT)) & 1); +} + +void bitmap_clear(u8 *bitmap, i32 n) { + assert((n % 8) == 0); + memset(bitmap, 0, n / CHAR_BIT); +} + +void bitmap_fill(u8 *bitmap, i32 n) { + assert((n % 8) == 0); + memset(bitmap, 0xFF, n / CHAR_BIT); +} + +/** + * @brief Finds the minimum k items in distances, and writes the indicies to + * out. + * + * @param distances input f32 array of size n, the items to consider. + * @param n: size of distances array. + * @param out: Output array of size k, will contain at most k element indicies + * @param k: Size of output array + * @return int + */ +int min_idx(const f32 *distances, i32 n, u8 *candidates, i32 *out, i32 k, + u8 *bTaken, i32 *k_used) { + assert(k > 0); + assert(k <= n); + + bitmap_clear(bTaken, n); + + for (int ik = 0; ik < k; ik++) { + int min_idx = 0; + while (min_idx < n && + (bitmap_get(bTaken, min_idx) || !bitmap_get(candidates, min_idx))) { + min_idx++; + } + if (min_idx >= n) { + *k_used = ik; + return SQLITE_OK; + } + + for (int i = 0; i < n; i++) { + if (distances[i] <= distances[min_idx] && !bitmap_get(bTaken, i) && + (bitmap_get(candidates, i))) { + min_idx = i; + } + } + + out[ik] = min_idx; + bitmap_set(bTaken, min_idx, 1); + } + *k_used = k; + return SQLITE_OK; +} + +int vec0_get_metadata_text_long_value( + vec0_vtab * p, + sqlite3_stmt ** stmt, + int metadata_idx, + i64 rowid, + int *n, + char ** s) { + int rc; + if(!(*stmt)) { + const char * zSql = sqlite3_mprintf("select data from " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " where rowid = ?", p->schemaName, p->tableName, metadata_idx); + if(!zSql) { + rc = SQLITE_NOMEM; + goto done; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, stmt, NULL); + sqlite3_free( (void *) zSql); + if(rc != SQLITE_OK) { + goto done; + } + } + + sqlite3_reset(*stmt); + sqlite3_bind_int64(*stmt, 1, rowid); + rc = sqlite3_step(*stmt); + if(rc != SQLITE_ROW) { + rc = SQLITE_ERROR; + goto done; + } + *s = (char *) sqlite3_column_text(*stmt, 0); + *n = sqlite3_column_bytes(*stmt, 0); + rc = SQLITE_OK; + done: + return rc; +} + +/** + * @brief Crete at "iterator" (sqlite3_stmt) of chunks with the given constraints + * + * Any VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT values in idxStr/argv will be applied + * as WHERE constraints in the underlying stmt SQL, and any consumer of the stmt + * can freely step through the stmt with all constraints satisfied. + * + * @param p - vec0_vtab + * @param idxStr - the xBestIndex/xFilter idxstr containing VEC0_IDXSTR values + * @param argc - number of argv values from xFilter + * @param argv - array of sqlite3_value from xFilter + * @param outStmt - output sqlite3_stmt of chunks with all filters applied + * @return int SQLITE_OK on success, error code otherwise + */ +int vec0_chunks_iter(vec0_vtab * p, const char * idxStr, int argc, sqlite3_value ** argv, sqlite3_stmt** outStmt) { + // always null terminated, enforced by SQLite + int idxStrLength = strlen(idxStr); + // "1" refers to the initial vec0_query_plan char, 4 is the number of chars per "element" + int numValueEntries = (idxStrLength-1) / 4; + assert(argc == numValueEntries); + + int rc; + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "select chunk_id, validity, rowids " + " from " VEC0_SHADOW_CHUNKS_NAME, + p->schemaName, p->tableName); + + int appendedWhere = 0; + for(int i = 0; i < numValueEntries; i++) { + int idx = 1 + (i * 4); + char kind = idxStr[idx + 0]; + if(kind != VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT) { + continue; + } + + int partition_idx = idxStr[idx + 1] - 'A'; + int operator = idxStr[idx + 2]; + // idxStr[idx + 3] is just null, a '_' placeholder + + if(!appendedWhere) { + sqlite3_str_appendall(s, " WHERE "); + appendedWhere = 1; + }else { + sqlite3_str_appendall(s, " AND "); + } + switch(operator) { + case VEC0_PARTITION_OPERATOR_EQ: + sqlite3_str_appendf(s, " partition%02d = ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_GT: + sqlite3_str_appendf(s, " partition%02d > ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_LE: + sqlite3_str_appendf(s, " partition%02d <= ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_LT: + sqlite3_str_appendf(s, " partition%02d < ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_GE: + sqlite3_str_appendf(s, " partition%02d >= ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_NE: + sqlite3_str_appendf(s, " partition%02d != ? ", partition_idx); + break; + default: { + char * zSql = sqlite3_str_finish(s); + sqlite3_free(zSql); + return SQLITE_ERROR; + } + + } + + } + + char *zSql = sqlite3_str_finish(s); + if (!zSql) { + return SQLITE_NOMEM; + } + + rc = sqlite3_prepare_v2(p->db, zSql, -1, outStmt, NULL); + sqlite3_free(zSql); + if(rc != SQLITE_OK) { + return rc; + } + + int n = 1; + for(int i = 0; i < numValueEntries; i++) { + int idx = 1 + (i * 4); + char kind = idxStr[idx + 0]; + if(kind != VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT) { + continue; + } + sqlite3_bind_value(*outStmt, n++, argv[i]); + } + + return rc; +} + +// a single `xxx in (...)` constraint on a metadata column. TEXT or INTEGER only for now. +struct Vec0MetadataIn{ + // index of argv[i]` the constraint is on + int argv_idx; + // metadata column index of the constraint, derived from idxStr + argv_idx + int metadata_idx; + // array of the copied `(...)` values from sqlite3_vtab_in_first()/sqlite3_vtab_in_next() + struct Array array; +}; + +// Array elements for `xxx in (...)` values for a text column. basically just a string +struct Vec0MetadataInTextEntry { + int n; + char * zString; +}; + + +int vec0_metadata_filter_text(vec0_vtab * p, sqlite3_value * value, const void * buffer, int size, vec0_metadata_operator op, u8* b, int metadata_idx, int chunk_rowid, struct Array * aMetadataIn, int argv_idx) { + int rc; + sqlite3_stmt * stmt = NULL; + i64 * rowids = NULL; + sqlite3_blob * rowidsBlob; + const char * sTarget = (const char *) sqlite3_value_text(value); + int nTarget = sqlite3_value_bytes(value); + + + // TODO(perf): only text metadata news the rowids BLOB. Make it so that + // rowids BLOB is re-used when multiple fitlers on text columns, + // ex "name BETWEEN 'a' and 'b'"" + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, "rowids", chunk_rowid, 0, &rowidsBlob); + if(rc != SQLITE_OK) { + return rc; + } + assert(sqlite3_blob_bytes(rowidsBlob) % sizeof(i64) == 0); + assert((sqlite3_blob_bytes(rowidsBlob) / sizeof(i64)) == size); + + rowids = sqlite3_malloc(sqlite3_blob_bytes(rowidsBlob)); + if(!rowids) { + sqlite3_blob_close(rowidsBlob); + return SQLITE_NOMEM; + } + + rc = sqlite3_blob_read(rowidsBlob, rowids, sqlite3_blob_bytes(rowidsBlob), 0); + if(rc != SQLITE_OK) { + sqlite3_blob_close(rowidsBlob); + return rc; + } + sqlite3_blob_close(rowidsBlob); + + switch(op) { + int nPrefix; + char * sPrefix; + char *sFull; + int nFull; + u8 * view; + case VEC0_METADATA_OPERATOR_EQ: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + + // for EQ the text lengths must match + if(nPrefix != nTarget) { + bitmap_set(b, i, 0); + continue; + } + int cmpPrefix = strncmp(sPrefix, sTarget, min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH)); + + // for short strings, use the prefix comparison direclty + if(nPrefix <= VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + bitmap_set(b, i, cmpPrefix == 0); + continue; + } + // for EQ on longs strings, the prefix must match + if(cmpPrefix) { + bitmap_set(b, i, 0); + continue; + } + // consult the full string + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) == 0); + } + break; + } + case VEC0_METADATA_OPERATOR_NE: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + + // for NE if text lengths dont match, it never will + if(nPrefix != nTarget) { + bitmap_set(b, i, 1); + continue; + } + + int cmpPrefix = strncmp(sPrefix, sTarget, min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH)); + + // for short strings, use the prefix comparison direclty + if(nPrefix <= VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + bitmap_set(b, i, cmpPrefix != 0); + continue; + } + // for NE on longs strings, if prefixes dont match, then long string wont + if(cmpPrefix) { + bitmap_set(b, i, 1); + continue; + } + // consult the full string + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) != 0); + } + break; + } + case VEC0_METADATA_OPERATOR_GT: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget)); + + if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + // if prefix match, check which is longer + if(cmpPrefix == 0) { + bitmap_set(b, i, nPrefix > nTarget); + } + else { + bitmap_set(b, i, cmpPrefix > 0); + } + continue; + } + // TODO(perf): may not need to compare full text in some cases + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) > 0); + } + break; + } + case VEC0_METADATA_OPERATOR_GE: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget)); + + if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + // if prefix match, check which is longer + if(cmpPrefix == 0) { + bitmap_set(b, i, nPrefix >= nTarget); + } + else { + bitmap_set(b, i, cmpPrefix >= 0); + } + continue; + } + // TODO(perf): may not need to compare full text in some cases + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) >= 0); + } + break; + } + case VEC0_METADATA_OPERATOR_LE: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget)); + + if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + // if prefix match, check which is longer + if(cmpPrefix == 0) { + bitmap_set(b, i, nPrefix <= nTarget); + } + else { + bitmap_set(b, i, cmpPrefix <= 0); + } + continue; + } + // TODO(perf): may not need to compare full text in some cases + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) <= 0); + } + break; + } + case VEC0_METADATA_OPERATOR_LT: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget)); + + if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + // if prefix match, check which is longer + if(cmpPrefix == 0) { + bitmap_set(b, i, nPrefix < nTarget); + } + else { + bitmap_set(b, i, cmpPrefix < 0); + } + continue; + } + // TODO(perf): may not need to compare full text in some cases + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) < 0); + } + break; + } + + case VEC0_METADATA_OPERATOR_IN: { + size_t metadataInIdx = -1; + for(size_t i = 0; i < aMetadataIn->length; i++) { + struct Vec0MetadataIn * metadataIn = &(((struct Vec0MetadataIn *) aMetadataIn->z)[i]); + if(metadataIn->argv_idx == argv_idx) { + metadataInIdx = i; + break; + } + } + if(metadataInIdx < 0) { + rc = SQLITE_ERROR; + goto done; + } + + struct Vec0MetadataIn * metadataIn = &((struct Vec0MetadataIn *) aMetadataIn->z)[metadataInIdx]; + struct Array * aTarget = &(metadataIn->array); + + + int nPrefix; + char * sPrefix; + char *sFull; + int nFull; + u8 * view; + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + for(size_t target_idx = 0; target_idx < aTarget->length; target_idx++) { + struct Vec0MetadataInTextEntry * entry = &(((struct Vec0MetadataInTextEntry*)aTarget->z)[target_idx]); + if(entry->n != nPrefix) { + continue; + } + int cmpPrefix = strncmp(sPrefix, entry->zString, min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH)); + if(nPrefix <= VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + if(cmpPrefix == 0) { + bitmap_set(b, i, 1); + break; + } + continue; + } + if(cmpPrefix) { + continue; + } + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + if(strncmp(sFull, entry->zString, nFull) == 0) { + bitmap_set(b, i, 1); + break; + } + } + } + break; + } + + } + rc = SQLITE_OK; + + done: + sqlite3_finalize(stmt); + sqlite3_free(rowids); + return rc; + +} + +/** + * @brief Fill in bitmap of chunk values, whether or not the values match a metadata constraint + * + * @param p vec0_vtab + * @param metadata_idx index of the metatadata column to perfrom constraints on + * @param value sqlite3_value of the constraints value + * @param blob sqlite3_blob that is already opened on the metdata column's shadow chunk table + * @param chunk_rowid rowid of the chunk to calculate on + * @param b pre-allocated and zero'd out bitmap to write results to + * @param size size of the chunk + * @return int SQLITE_OK on success, error code otherwise + */ +int vec0_set_metadata_filter_bitmap( + vec0_vtab *p, + int metadata_idx, + vec0_metadata_operator op, + sqlite3_value * value, + sqlite3_blob * blob, + i64 chunk_rowid, + u8* b, + int size, + struct Array * aMetadataIn, int argv_idx) { + // TODO: shouldn't this skip in-valid entries from the chunk's validity bitmap? + + int rc; + rc = sqlite3_blob_reopen(blob, chunk_rowid); + if(rc != SQLITE_OK) { + return rc; + } + + vec0_metadata_column_kind kind = p->metadata_columns[metadata_idx].kind; + int szMatch = 0; + int blobSize = sqlite3_blob_bytes(blob); + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + szMatch = blobSize == size / CHAR_BIT; + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + szMatch = blobSize == size * sizeof(i64); + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + szMatch = blobSize == size * sizeof(double); + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + szMatch = blobSize == size * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH; + break; + } + } + if(!szMatch) { + return SQLITE_ERROR; + } + void * buffer = sqlite3_malloc(blobSize); + if(!buffer) { + return SQLITE_NOMEM; + } + rc = sqlite3_blob_read(blob, buffer, blobSize, 0); + if(rc != SQLITE_OK) { + goto done; + } + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + int target = sqlite3_value_int(value); + if( (target && op == VEC0_METADATA_OPERATOR_EQ) || (!target && op == VEC0_METADATA_OPERATOR_NE)) { + for(int i = 0; i < size; i++) { bitmap_set(b, i, bitmap_get((u8*) buffer, i)); } + } + else { + for(int i = 0; i < size; i++) { bitmap_set(b, i, !bitmap_get((u8*) buffer, i)); } + } + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + i64 * array = (i64*) buffer; + i64 target = sqlite3_value_int64(value); + switch(op) { + case VEC0_METADATA_OPERATOR_EQ: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] == target); } + break; + } + case VEC0_METADATA_OPERATOR_GT: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] > target); } + break; + } + case VEC0_METADATA_OPERATOR_LE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] <= target); } + break; + } + case VEC0_METADATA_OPERATOR_LT: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] < target); } + break; + } + case VEC0_METADATA_OPERATOR_GE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] >= target); } + break; + } + case VEC0_METADATA_OPERATOR_NE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] != target); } + break; + } + case VEC0_METADATA_OPERATOR_IN: { + int metadataInIdx = -1; + for(size_t i = 0; i < aMetadataIn->length; i++) { + struct Vec0MetadataIn * metadataIn = &((struct Vec0MetadataIn *) aMetadataIn->z)[i]; + if(metadataIn->argv_idx == argv_idx) { + metadataInIdx = i; + break; + } + } + if(metadataInIdx < 0) { + rc = SQLITE_ERROR; + goto done; + } + struct Vec0MetadataIn * metadataIn = &((struct Vec0MetadataIn *) aMetadataIn->z)[metadataInIdx]; + struct Array * aTarget = &(metadataIn->array); + + for(int i = 0; i < size; i++) { + for(size_t target_idx = 0; target_idx < aTarget->length; target_idx++) { + if( ((i64*)aTarget->z)[target_idx] == array[i]) { + bitmap_set(b, i, 1); + break; + } + } + } + break; + } + } + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + double * array = (double*) buffer; + double target = sqlite3_value_double(value); + switch(op) { + case VEC0_METADATA_OPERATOR_EQ: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] == target); } + break; + } + case VEC0_METADATA_OPERATOR_GT: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] > target); } + break; + } + case VEC0_METADATA_OPERATOR_LE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] <= target); } + break; + } + case VEC0_METADATA_OPERATOR_LT: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] < target); } + break; + } + case VEC0_METADATA_OPERATOR_GE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] >= target); } + break; + } + case VEC0_METADATA_OPERATOR_NE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] != target); } + break; + } + case VEC0_METADATA_OPERATOR_IN: { + // should never be reached + break; + } + } + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + rc = vec0_metadata_filter_text(p, value, buffer, size, op, b, metadata_idx, chunk_rowid, aMetadataIn, argv_idx); + if(rc != SQLITE_OK) { + goto done; + } + break; + } + } + done: + sqlite3_free(buffer); + return rc; +} + +int vec0Filter_knn_chunks_iter(vec0_vtab *p, sqlite3_stmt *stmtChunks, + struct VectorColumnDefinition *vector_column, + int vectorColumnIdx, struct Array *arrayRowidsIn, + struct Array * aMetadataIn, + const char * idxStr, int argc, sqlite3_value ** argv, + void *queryVector, i64 k, i64 **out_topk_rowids, + f32 **out_topk_distances, i64 *out_used) { + // for each chunk, get top min(k, chunk_size) rowid + distances to query vec. + // then reconcile all topk_chunks for a true top k. + // output only rowids + distances for now + + int rc = SQLITE_OK; + sqlite3_blob *blobVectors = NULL; + + void *baseVectors = NULL; // memory: chunk_size * dimensions * element_size + + // OWNED BY CALLER ON SUCCESS + i64 *topk_rowids = NULL; // memory: k * 4 + // OWNED BY CALLER ON SUCCESS + f32 *topk_distances = NULL; // memory: k * 4 + + i64 *tmp_topk_rowids = NULL; // memory: k * 4 + f32 *tmp_topk_distances = NULL; // memory: k * 4 + f32 *chunk_distances = NULL; // memory: chunk_size * 4 + u8 *b = NULL; // memory: chunk_size / 8 + u8 *bTaken = NULL; // memory: chunk_size / 8 + i32 *chunk_topk_idxs = NULL; // memory: k * 4 + u8 *bmRowids = NULL; // memory: chunk_size / 8 + u8 *bmMetadata = NULL; // memory: chunk_size / 8 + // // total: a lot??? + + // 6 * (k * 4) + (k * 2) + (chunk_size / 8) + (chunk_size * dimensions * 4) + + topk_rowids = sqlite3_malloc(k * sizeof(i64)); + if (!topk_rowids) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(topk_rowids, 0, k * sizeof(i64)); + + topk_distances = sqlite3_malloc(k * sizeof(f32)); + if (!topk_distances) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(topk_distances, 0, k * sizeof(f32)); + + tmp_topk_rowids = sqlite3_malloc(k * sizeof(i64)); + if (!tmp_topk_rowids) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(tmp_topk_rowids, 0, k * sizeof(i64)); + + tmp_topk_distances = sqlite3_malloc(k * sizeof(f32)); + if (!tmp_topk_distances) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(tmp_topk_distances, 0, k * sizeof(f32)); + + i64 k_used = 0; + i64 baseVectorsSize = p->chunk_size * vector_column_byte_size(*vector_column); + baseVectors = sqlite3_malloc(baseVectorsSize); + if (!baseVectors) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + chunk_distances = sqlite3_malloc(p->chunk_size * sizeof(f32)); + if (!chunk_distances) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + b = bitmap_new(p->chunk_size); + if (!b) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + bTaken = bitmap_new(p->chunk_size); + if (!bTaken) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + chunk_topk_idxs = sqlite3_malloc(k * sizeof(i32)); + if (!chunk_topk_idxs) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + bmRowids = arrayRowidsIn ? bitmap_new(p->chunk_size) : NULL; + if (arrayRowidsIn && !bmRowids) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + sqlite3_blob * metadataBlobs[VEC0_MAX_METADATA_COLUMNS]; + memset(metadataBlobs, 0, sizeof(sqlite3_blob*) * VEC0_MAX_METADATA_COLUMNS); + + bmMetadata = bitmap_new(p->chunk_size); + if(!bmMetadata) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + int idxStrLength = strlen(idxStr); + int numValueEntries = (idxStrLength-1) / 4; + assert(numValueEntries == argc); + int hasMetadataFilters = 0; + for(int i = 0; i < argc; i++) { + int idx = 1 + (i * 4); + char kind = idxStr[idx + 0]; + if(kind == VEC0_IDXSTR_KIND_METADATA_CONSTRAINT) { + hasMetadataFilters = 1; + break; + } + } + + while (true) { + rc = sqlite3_step(stmtChunks); + if (rc == SQLITE_DONE) { + break; + } + if (rc != SQLITE_ROW) { + vtab_set_error(&p->base, "chunks iter error"); + rc = SQLITE_ERROR; + goto cleanup; + } + memset(chunk_distances, 0, p->chunk_size * sizeof(f32)); + memset(chunk_topk_idxs, 0, k * sizeof(i32)); + bitmap_clear(b, p->chunk_size); + + i64 chunk_id = sqlite3_column_int64(stmtChunks, 0); + unsigned char *chunkValidity = + (unsigned char *)sqlite3_column_blob(stmtChunks, 1); + i64 validitySize = sqlite3_column_bytes(stmtChunks, 1); + if (validitySize != p->chunk_size / CHAR_BIT) { + // IMP: V05271_22109 + vtab_set_error( + &p->base, + "chunk validity size doesn't match - expected %lld, found %lld", + p->chunk_size / CHAR_BIT, validitySize); + rc = SQLITE_ERROR; + goto cleanup; + } + + i64 *chunkRowids = (i64 *)sqlite3_column_blob(stmtChunks, 2); + i64 rowidsSize = sqlite3_column_bytes(stmtChunks, 2); + if (rowidsSize != p->chunk_size * sizeof(i64)) { + // IMP: V02796_19635 + vtab_set_error(&p->base, "rowids size doesn't match"); + vtab_set_error( + &p->base, + "chunk rowids size doesn't match - expected %lld, found %lld", + p->chunk_size * sizeof(i64), rowidsSize); + rc = SQLITE_ERROR; + goto cleanup; + } + + // open the vector chunk blob for the current chunk + rc = sqlite3_blob_open(p->db, p->schemaName, + p->shadowVectorChunksNames[vectorColumnIdx], + "vectors", chunk_id, 0, &blobVectors); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "could not open vectors blob for chunk %lld", + chunk_id); + rc = SQLITE_ERROR; + goto cleanup; + } + + i64 currentBaseVectorsSize = sqlite3_blob_bytes(blobVectors); + i64 expectedBaseVectorsSize = + p->chunk_size * vector_column_byte_size(*vector_column); + if (currentBaseVectorsSize != expectedBaseVectorsSize) { + // IMP: V16465_00535 + vtab_set_error( + &p->base, + "vectors blob size doesn't match - expected %lld, found %lld", + expectedBaseVectorsSize, currentBaseVectorsSize); + rc = SQLITE_ERROR; + goto cleanup; + } + rc = sqlite3_blob_read(blobVectors, baseVectors, currentBaseVectorsSize, 0); + + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "vectors blob read error for %lld", chunk_id); + rc = SQLITE_ERROR; + goto cleanup; + } + + bitmap_copy(b, chunkValidity, p->chunk_size); + if (arrayRowidsIn) { + bitmap_clear(bmRowids, p->chunk_size); + + for (int i = 0; i < p->chunk_size; i++) { + if (!bitmap_get(chunkValidity, i)) { + continue; + } + i64 rowid = chunkRowids[i]; + void *in = bsearch(&rowid, arrayRowidsIn->z, arrayRowidsIn->length, + sizeof(i64), _cmp); + bitmap_set(bmRowids, i, in ? 1 : 0); + } + bitmap_and_inplace(b, bmRowids, p->chunk_size); + } + + if(hasMetadataFilters) { + for(int i = 0; i < argc; i++) { + int idx = 1 + (i * 4); + char kind = idxStr[idx + 0]; + if(kind != VEC0_IDXSTR_KIND_METADATA_CONSTRAINT) { + continue; + } + int metadata_idx = idxStr[idx + 1] - 'A'; + int operator = idxStr[idx + 2]; + + if(!metadataBlobs[metadata_idx]) { + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_idx], "data", chunk_id, 0, &metadataBlobs[metadata_idx]); + vtab_set_error(&p->base, "Could not open metadata blob"); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + + bitmap_clear(bmMetadata, p->chunk_size); + rc = vec0_set_metadata_filter_bitmap(p, metadata_idx, operator, argv[i], metadataBlobs[metadata_idx], chunk_id, bmMetadata, p->chunk_size, aMetadataIn, i); + if(rc != SQLITE_OK) { + vtab_set_error(&p->base, "Could not filter metadata fields"); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + bitmap_and_inplace(b, bmMetadata, p->chunk_size); + } + } + + + for (int i = 0; i < p->chunk_size; i++) { + if (!bitmap_get(b, i)) { + continue; + }; + + f32 result; + switch (vector_column->element_type) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + const f32 *base_i = + ((f32 *)baseVectors) + (i * vector_column->dimensions); + switch (vector_column->distance_metric) { + case VEC0_DISTANCE_METRIC_L2: { + result = distance_l2_sqr_float(base_i, (f32 *)queryVector, + &vector_column->dimensions); + break; + } + case VEC0_DISTANCE_METRIC_L1: { + result = distance_l1_f32(base_i, (f32 *)queryVector, + &vector_column->dimensions); + break; + } + case VEC0_DISTANCE_METRIC_COSINE: { + result = distance_cosine_float(base_i, (f32 *)queryVector, + &vector_column->dimensions); + break; + } + } + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + const i8 *base_i = + ((i8 *)baseVectors) + (i * vector_column->dimensions); + switch (vector_column->distance_metric) { + case VEC0_DISTANCE_METRIC_L2: { + result = distance_l2_sqr_int8(base_i, (i8 *)queryVector, + &vector_column->dimensions); + break; + } + case VEC0_DISTANCE_METRIC_L1: { + result = distance_l1_int8(base_i, (i8 *)queryVector, + &vector_column->dimensions); + break; + } + case VEC0_DISTANCE_METRIC_COSINE: { + result = distance_cosine_int8(base_i, (i8 *)queryVector, + &vector_column->dimensions); + break; + } + } + + break; + } + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + const u8 *base_i = + ((u8 *)baseVectors) + (i * (vector_column->dimensions / CHAR_BIT)); + result = distance_hamming(base_i, (u8 *)queryVector, + &vector_column->dimensions); + break; + } + } + + chunk_distances[i] = result; + } + + int used1; + min_idx(chunk_distances, p->chunk_size, b, chunk_topk_idxs, + min(k, p->chunk_size), bTaken, &used1); + + i64 used; + merge_sorted_lists(topk_distances, topk_rowids, k_used, chunk_distances, + chunkRowids, chunk_topk_idxs, + min(min(k, p->chunk_size), used1), tmp_topk_distances, + tmp_topk_rowids, k, &used); + + for (int i = 0; i < used; i++) { + topk_rowids[i] = tmp_topk_rowids[i]; + topk_distances[i] = tmp_topk_distances[i]; + } + k_used = used; + // blobVectors is always opened with read-only permissions, so this never + // fails. + sqlite3_blob_close(blobVectors); + blobVectors = NULL; + } + + *out_topk_rowids = topk_rowids; + *out_topk_distances = topk_distances; + *out_used = k_used; + rc = SQLITE_OK; + +cleanup: + if (rc != SQLITE_OK) { + sqlite3_free(topk_rowids); + sqlite3_free(topk_distances); + } + sqlite3_free(chunk_topk_idxs); + sqlite3_free(tmp_topk_rowids); + sqlite3_free(tmp_topk_distances); + sqlite3_free(b); + sqlite3_free(bTaken); + sqlite3_free(bmRowids); + sqlite3_free(baseVectors); + sqlite3_free(chunk_distances); + sqlite3_free(bmMetadata); + for(int i = 0; i < VEC0_MAX_METADATA_COLUMNS; i++) { + sqlite3_blob_close(metadataBlobs[i]); + } + // blobVectors is always opened with read-only permissions, so this never + // fails. + sqlite3_blob_close(blobVectors); + return rc; +} + +int vec0Filter_knn(vec0_cursor *pCur, vec0_vtab *p, int idxNum, + const char *idxStr, int argc, sqlite3_value **argv) { + assert(argc == (strlen(idxStr)-1) / 4); + int rc; + struct vec0_query_knn_data *knn_data; + + int vectorColumnIdx = idxNum; + struct VectorColumnDefinition *vector_column = + &p->vector_columns[vectorColumnIdx]; + + struct Array *arrayRowidsIn = NULL; + sqlite3_stmt *stmtChunks = NULL; + void *queryVector; + size_t dimensions; + enum VectorElementType elementType; + vector_cleanup queryVectorCleanup = vector_cleanup_noop; + char *pzError; + knn_data = sqlite3_malloc(sizeof(*knn_data)); + if (!knn_data) { + return SQLITE_NOMEM; + } + memset(knn_data, 0, sizeof(*knn_data)); + // array of `struct Vec0MetadataIn`, IF there are any `xxx in (...)` metadata constraints + struct Array * aMetadataIn = NULL; + + int query_idx =-1; + int k_idx = -1; + int rowid_in_idx = -1; + for(int i = 0; i < argc; i++) { + if(idxStr[1 + (i*4)] == VEC0_IDXSTR_KIND_KNN_MATCH) { + query_idx = i; + } + if(idxStr[1 + (i*4)] == VEC0_IDXSTR_KIND_KNN_K) { + k_idx = i; + } + if(idxStr[1 + (i*4)] == VEC0_IDXSTR_KIND_KNN_ROWID_IN) { + rowid_in_idx = i; + } + } + assert(query_idx >= 0); + assert(k_idx >= 0); + + // make sure the query vector matches the vector column (type dimensions etc.) + rc = vector_from_value(argv[query_idx], &queryVector, &dimensions, &elementType, + &queryVectorCleanup, &pzError); + + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + "Query vector on the \"%.*s\" column is invalid: %z", + vector_column->name_length, vector_column->name, pzError); + rc = SQLITE_ERROR; + goto cleanup; + } + if (elementType != vector_column->element_type) { + vtab_set_error( + &p->base, + "Query vector for the \"%.*s\" column is expected to be of type " + "%s, but a %s vector was provided.", + vector_column->name_length, vector_column->name, + vector_subtype_name(vector_column->element_type), + vector_subtype_name(elementType)); + rc = SQLITE_ERROR; + goto cleanup; + } + if (dimensions != vector_column->dimensions) { + vtab_set_error( + &p->base, + "Dimension mismatch for query vector for the \"%.*s\" column. " + "Expected %d dimensions but received %d.", + vector_column->name_length, vector_column->name, + vector_column->dimensions, dimensions); + rc = SQLITE_ERROR; + goto cleanup; + } + + i64 k = sqlite3_value_int64(argv[k_idx]); + if (k < 0) { + vtab_set_error( + &p->base, "k value in knn queries must be greater than or equal to 0."); + rc = SQLITE_ERROR; + goto cleanup; + } +#define SQLITE_VEC_VEC0_K_MAX 4096 + if (k > SQLITE_VEC_VEC0_K_MAX) { + vtab_set_error( + &p->base, + "k value in knn query too large, provided %lld and the limit is %lld", + k, SQLITE_VEC_VEC0_K_MAX); + rc = SQLITE_ERROR; + goto cleanup; + } + + if (k == 0) { + knn_data->k = 0; + pCur->knn_data = knn_data; + pCur->query_plan = VEC0_QUERY_PLAN_KNN; + rc = SQLITE_OK; + goto cleanup; + } + +// handle when a `rowid in (...)` operation was provided +// Array of all the rowids that appear in any `rowid in (...)` constraint. +// NULL if none were provided, which means a "full" scan. +#if COMPILER_SUPPORTS_VTAB_IN + if (rowid_in_idx >= 0) { + sqlite3_value *item; + int rc; + arrayRowidsIn = sqlite3_malloc(sizeof(*arrayRowidsIn)); + if (!arrayRowidsIn) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(arrayRowidsIn, 0, sizeof(*arrayRowidsIn)); + + rc = array_init(arrayRowidsIn, sizeof(i64), 32); + if (rc != SQLITE_OK) { + goto cleanup; + } + for (rc = sqlite3_vtab_in_first(argv[rowid_in_idx], &item); rc == SQLITE_OK && item; + rc = sqlite3_vtab_in_next(argv[rowid_in_idx], &item)) { + i64 rowid; + if (p->pkIsText) { + rc = vec0_rowid_from_id(p, item, &rowid); + if (rc != SQLITE_OK) { + goto cleanup; + } + } else { + rowid = sqlite3_value_int64(item); + } + rc = array_append(arrayRowidsIn, &rowid); + if (rc != SQLITE_OK) { + goto cleanup; + } + } + if (rc != SQLITE_DONE) { + vtab_set_error(&p->base, "error processing rowid in (...) array"); + goto cleanup; + } + qsort(arrayRowidsIn->z, arrayRowidsIn->length, arrayRowidsIn->element_size, + _cmp); + } +#endif + + #if COMPILER_SUPPORTS_VTAB_IN + for(int i = 0; i < argc; i++) { + if(!(idxStr[1 + (i*4)] == VEC0_IDXSTR_KIND_METADATA_CONSTRAINT && idxStr[1 + (i*4) + 2] == VEC0_METADATA_OPERATOR_IN)) { + continue; + } + int metadata_idx = idxStr[1 + (i*4) + 1] - 'A'; + if(!aMetadataIn) { + aMetadataIn = sqlite3_malloc(sizeof(*aMetadataIn)); + if(!aMetadataIn) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(aMetadataIn, 0, sizeof(*aMetadataIn)); + rc = array_init(aMetadataIn, sizeof(struct Vec0MetadataIn), 8); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + + struct Vec0MetadataIn item; + memset(&item, 0, sizeof(item)); + item.metadata_idx=metadata_idx; + item.argv_idx = i; + + switch(p->metadata_columns[metadata_idx].kind) { + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + rc = array_init(&item.array, sizeof(i64), 16); + if(rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_value *entry; + for (rc = sqlite3_vtab_in_first(argv[i], &entry); rc == SQLITE_OK && entry; rc = sqlite3_vtab_in_next(argv[i], &entry)) { + i64 v = sqlite3_value_int64(entry); + rc = array_append(&item.array, &v); + if (rc != SQLITE_OK) { + goto cleanup; + } + } + + if (rc != SQLITE_DONE) { + vtab_set_error(&p->base, "Error fetching next value in `x in (...)` integer expression"); + goto cleanup; + } + + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + rc = array_init(&item.array, sizeof(struct Vec0MetadataInTextEntry), 16); + if(rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_value *entry; + for (rc = sqlite3_vtab_in_first(argv[i], &entry); rc == SQLITE_OK && entry; rc = sqlite3_vtab_in_next(argv[i], &entry)) { + const char * s = (const char *) sqlite3_value_text(entry); + int n = sqlite3_value_bytes(entry); + + struct Vec0MetadataInTextEntry entry; + entry.zString = sqlite3_mprintf("%.*s", n, s); + if(!entry.zString) { + rc = SQLITE_NOMEM; + goto cleanup; + } + entry.n = n; + rc = array_append(&item.array, &entry); + if (rc != SQLITE_OK) { + goto cleanup; + } + } + + if (rc != SQLITE_DONE) { + vtab_set_error(&p->base, "Error fetching next value in `x in (...)` text expression"); + goto cleanup; + } + + break; + } + default: { + vtab_set_error(&p->base, "Internal sqlite-vec error"); + goto cleanup; + } + } + + rc = array_append(aMetadataIn, &item); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + #endif + + rc = vec0_chunks_iter(p, idxStr, argc, argv, &stmtChunks); + if (rc != SQLITE_OK) { + // IMP: V06942_23781 + vtab_set_error(&p->base, "Error preparing stmtChunk: %s", + sqlite3_errmsg(p->db)); + goto cleanup; + } + + i64 *topk_rowids = NULL; + f32 *topk_distances = NULL; + i64 k_used = 0; + rc = vec0Filter_knn_chunks_iter(p, stmtChunks, vector_column, vectorColumnIdx, + arrayRowidsIn, aMetadataIn, idxStr, argc, argv, queryVector, k, &topk_rowids, + &topk_distances, &k_used); + if (rc != SQLITE_OK) { + goto cleanup; + } + + knn_data->current_idx = 0; + knn_data->k = k; + knn_data->rowids = topk_rowids; + knn_data->distances = topk_distances; + knn_data->k_used = k_used; + + pCur->knn_data = knn_data; + pCur->query_plan = VEC0_QUERY_PLAN_KNN; + rc = SQLITE_OK; + +cleanup: + sqlite3_finalize(stmtChunks); + array_cleanup(arrayRowidsIn); + sqlite3_free(arrayRowidsIn); + queryVectorCleanup(queryVector); + if(aMetadataIn) { + for(size_t i = 0; i < aMetadataIn->length; i++) { + struct Vec0MetadataIn* item = &((struct Vec0MetadataIn *) aMetadataIn->z)[i]; + for(size_t j = 0; j < item->array.length; j++) { + if(p->metadata_columns[item->metadata_idx].kind == VEC0_METADATA_COLUMN_KIND_TEXT) { + struct Vec0MetadataInTextEntry entry = ((struct Vec0MetadataInTextEntry*)item->array.z)[j]; + sqlite3_free(entry.zString); + } + } + array_cleanup(&item->array); + } + array_cleanup(aMetadataIn); + } + + sqlite3_free(aMetadataIn); + + return rc; +} + +int vec0Filter_fullscan(vec0_vtab *p, vec0_cursor *pCur) { + int rc; + char *zSql; + struct vec0_query_fullscan_data *fullscan_data; + + fullscan_data = sqlite3_malloc(sizeof(*fullscan_data)); + if (!fullscan_data) { + return SQLITE_NOMEM; + } + memset(fullscan_data, 0, sizeof(*fullscan_data)); + + zSql = sqlite3_mprintf(" SELECT rowid " + " FROM " VEC0_SHADOW_ROWIDS_NAME + " ORDER by chunk_id, chunk_offset ", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto error; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &fullscan_data->rowids_stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + // IMP: V09901_26739 + vtab_set_error(&p->base, "Error preparing rowid scan: %s", + sqlite3_errmsg(p->db)); + goto error; + } + + rc = sqlite3_step(fullscan_data->rowids_stmt); + + // DONE when there's no rowids, ROW when there are, both "success" + if (!(rc == SQLITE_ROW || rc == SQLITE_DONE)) { + goto error; + } + + fullscan_data->done = rc == SQLITE_DONE; + pCur->query_plan = VEC0_QUERY_PLAN_FULLSCAN; + pCur->fullscan_data = fullscan_data; + return SQLITE_OK; + +error: + vec0_query_fullscan_data_clear(fullscan_data); + sqlite3_free(fullscan_data); + return rc; +} + +int vec0Filter_point(vec0_cursor *pCur, vec0_vtab *p, int argc, + sqlite3_value **argv) { + int rc; + assert(argc == 1); + i64 rowid; + struct vec0_query_point_data *point_data = NULL; + + point_data = sqlite3_malloc(sizeof(*point_data)); + if (!point_data) { + rc = SQLITE_NOMEM; + goto error; + } + memset(point_data, 0, sizeof(*point_data)); + + if (p->pkIsText) { + rc = vec0_rowid_from_id(p, argv[0], &rowid); + if (rc == SQLITE_EMPTY) { + goto eof; + } + if (rc != SQLITE_OK) { + goto error; + } + } else { + rowid = sqlite3_value_int64(argv[0]); + } + + for (int i = 0; i < p->numVectorColumns; i++) { + rc = vec0_get_vector_data(p, rowid, i, &point_data->vectors[i], NULL); + if (rc == SQLITE_EMPTY) { + goto eof; + } + if (rc != SQLITE_OK) { + goto error; + } + } + + point_data->rowid = rowid; + point_data->done = 0; + pCur->point_data = point_data; + pCur->query_plan = VEC0_QUERY_PLAN_POINT; + return SQLITE_OK; + +eof: + point_data->rowid = rowid; + point_data->done = 1; + pCur->point_data = point_data; + pCur->query_plan = VEC0_QUERY_PLAN_POINT; + return SQLITE_OK; + +error: + vec0_query_point_data_clear(point_data); + sqlite3_free(point_data); + return rc; +} + +static int vec0Filter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, + const char *idxStr, int argc, sqlite3_value **argv) { + vec0_vtab *p = (vec0_vtab *)pVtabCursor->pVtab; + vec0_cursor *pCur = (vec0_cursor *)pVtabCursor; + vec0_cursor_clear(pCur); + + int idxStrLength = strlen(idxStr); + if(idxStrLength <= 0) { + return SQLITE_ERROR; + } + if((idxStrLength-1) % 4 != 0) { + return SQLITE_ERROR; + } + int numValueEntries = (idxStrLength-1) / 4; + if(numValueEntries != argc) { + return SQLITE_ERROR; + } + + char query_plan = idxStr[0]; + switch(query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: + return vec0Filter_fullscan(p, pCur); + case VEC0_QUERY_PLAN_KNN: + return vec0Filter_knn(pCur, p, idxNum, idxStr, argc, argv); + case VEC0_QUERY_PLAN_POINT: + return vec0Filter_point(pCur, p, argc, argv); + default: + vtab_set_error(pVtabCursor->pVtab, "unknown idxStr '%s'", idxStr); + return SQLITE_ERROR; + } +} + +static int vec0Rowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid) { + vec0_cursor *pCur = (vec0_cursor *)cur; + switch (pCur->query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: { + *pRowid = sqlite3_column_int64(pCur->fullscan_data->rowids_stmt, 0); + return SQLITE_OK; + } + case VEC0_QUERY_PLAN_POINT: { + *pRowid = pCur->point_data->rowid; + return SQLITE_OK; + } + case VEC0_QUERY_PLAN_KNN: { + vtab_set_error(cur->pVtab, + "Internal sqlite-vec error: expected point query plan in " + "vec0Rowid, found %d", + pCur->query_plan); + return SQLITE_ERROR; + } + } + return SQLITE_ERROR; +} + +static int vec0Next(sqlite3_vtab_cursor *cur) { + vec0_cursor *pCur = (vec0_cursor *)cur; + switch (pCur->query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: { + if (!pCur->fullscan_data) { + return SQLITE_ERROR; + } + int rc = sqlite3_step(pCur->fullscan_data->rowids_stmt); + if (rc == SQLITE_DONE) { + pCur->fullscan_data->done = 1; + return SQLITE_OK; + } + if (rc == SQLITE_ROW) { + return SQLITE_OK; + } + return SQLITE_ERROR; + } + case VEC0_QUERY_PLAN_KNN: { + if (!pCur->knn_data) { + return SQLITE_ERROR; + } + + pCur->knn_data->current_idx++; + return SQLITE_OK; + } + case VEC0_QUERY_PLAN_POINT: { + if (!pCur->point_data) { + return SQLITE_ERROR; + } + pCur->point_data->done = 1; + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +static int vec0Eof(sqlite3_vtab_cursor *cur) { + vec0_cursor *pCur = (vec0_cursor *)cur; + switch (pCur->query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: { + if (!pCur->fullscan_data) { + return 1; + } + return pCur->fullscan_data->done; + } + case VEC0_QUERY_PLAN_KNN: { + if (!pCur->knn_data) { + return 1; + } + // return (pCur->knn_data->current_idx >= pCur->knn_data->k) || + // (pCur->knn_data->distances[pCur->knn_data->current_idx] == FLT_MAX); + return (pCur->knn_data->current_idx >= pCur->knn_data->k_used); + } + case VEC0_QUERY_PLAN_POINT: { + if (!pCur->point_data) { + return 1; + } + return pCur->point_data->done; + } + } + return 1; +} + +static int vec0Column_fullscan(vec0_vtab *pVtab, vec0_cursor *pCur, + sqlite3_context *context, int i) { + if (!pCur->fullscan_data) { + sqlite3_result_error( + context, "Internal sqlite-vec error: fullscan_data is NULL.", -1); + return SQLITE_ERROR; + } + i64 rowid = sqlite3_column_int64(pCur->fullscan_data->rowids_stmt, 0); + if (i == VEC0_COLUMN_ID) { + return vec0_result_id(pVtab, context, rowid); + } + else if (vec0_column_idx_is_vector(pVtab, i)) { + void *v; + int sz; + int vector_idx = vec0_column_idx_to_vector_idx(pVtab, i); + int rc = vec0_get_vector_data(pVtab, rowid, vector_idx, &v, &sz); + if (rc != SQLITE_OK) { + return rc; + } + sqlite3_result_blob(context, v, sz, sqlite3_free); + sqlite3_result_subtype(context, + pVtab->vector_columns[vector_idx].element_type); + + } + else if (i == vec0_column_distance_idx(pVtab)) { + sqlite3_result_null(context); + } + else if(vec0_column_idx_is_partition(pVtab, i)) { + int partition_idx = vec0_column_idx_to_partition_idx(pVtab, i); + sqlite3_value * v; + int rc = vec0_get_partition_value_for_rowid(pVtab, rowid, partition_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + else if(vec0_column_idx_is_auxiliary(pVtab, i)) { + int auxiliary_idx = vec0_column_idx_to_auxiliary_idx(pVtab, i); + sqlite3_value * v; + int rc = vec0_get_auxiliary_value_for_rowid(pVtab, rowid, auxiliary_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + + else if(vec0_column_idx_is_metadata(pVtab, i)) { + if(sqlite3_vtab_nochange(context)) { + return SQLITE_OK; + } + int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i); + int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context); + if(rc != SQLITE_OK) { + // IMP: V15466_32305 + const char * zErr = sqlite3_mprintf( + "Could not extract metadata value for column %.*s at rowid %lld", + pVtab->metadata_columns[metadata_idx].name_length, + pVtab->metadata_columns[metadata_idx].name, rowid + ); + if(zErr) { + sqlite3_result_error(context, zErr, -1); + sqlite3_free((void *) zErr); + }else { + sqlite3_result_error_nomem(context); + } + } + } + + return SQLITE_OK; +} + +static int vec0Column_point(vec0_vtab *pVtab, vec0_cursor *pCur, + sqlite3_context *context, int i) { + if (!pCur->point_data) { + sqlite3_result_error(context, + "Internal sqlite-vec error: point_data is NULL.", -1); + return SQLITE_ERROR; + } + if (i == VEC0_COLUMN_ID) { + return vec0_result_id(pVtab, context, pCur->point_data->rowid); + } + else if (i == vec0_column_distance_idx(pVtab)) { + sqlite3_result_null(context); + return SQLITE_OK; + } + else if (vec0_column_idx_is_vector(pVtab, i)) { + if (sqlite3_vtab_nochange(context)) { + sqlite3_result_null(context); + return SQLITE_OK; + } + int vector_idx = vec0_column_idx_to_vector_idx(pVtab, i); + sqlite3_result_blob( + context, pCur->point_data->vectors[vector_idx], + vector_column_byte_size(pVtab->vector_columns[vector_idx]), + SQLITE_TRANSIENT); + sqlite3_result_subtype(context, + pVtab->vector_columns[vector_idx].element_type); + return SQLITE_OK; + } + else if(vec0_column_idx_is_partition(pVtab, i)) { + if(sqlite3_vtab_nochange(context)) { + return SQLITE_OK; + } + int partition_idx = vec0_column_idx_to_partition_idx(pVtab, i); + i64 rowid = pCur->point_data->rowid; + sqlite3_value * v; + int rc = vec0_get_partition_value_for_rowid(pVtab, rowid, partition_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + else if(vec0_column_idx_is_auxiliary(pVtab, i)) { + if(sqlite3_vtab_nochange(context)) { + return SQLITE_OK; + } + i64 rowid = pCur->point_data->rowid; + int auxiliary_idx = vec0_column_idx_to_auxiliary_idx(pVtab, i); + sqlite3_value * v; + int rc = vec0_get_auxiliary_value_for_rowid(pVtab, rowid, auxiliary_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + + else if(vec0_column_idx_is_metadata(pVtab, i)) { + if(sqlite3_vtab_nochange(context)) { + return SQLITE_OK; + } + i64 rowid = pCur->point_data->rowid; + int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i); + int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context); + if(rc != SQLITE_OK) { + const char * zErr = sqlite3_mprintf( + "Could not extract metadata value for column %.*s at rowid %lld", + pVtab->metadata_columns[metadata_idx].name_length, + pVtab->metadata_columns[metadata_idx].name, rowid + ); + if(zErr) { + sqlite3_result_error(context, zErr, -1); + sqlite3_free((void *) zErr); + }else { + sqlite3_result_error_nomem(context); + } + } + } + + return SQLITE_OK; +} + +static int vec0Column_knn(vec0_vtab *pVtab, vec0_cursor *pCur, + sqlite3_context *context, int i) { + if (!pCur->knn_data) { + sqlite3_result_error(context, + "Internal sqlite-vec error: knn_data is NULL.", -1); + return SQLITE_ERROR; + } + if (i == VEC0_COLUMN_ID) { + i64 rowid = pCur->knn_data->rowids[pCur->knn_data->current_idx]; + return vec0_result_id(pVtab, context, rowid); + } + else if (i == vec0_column_distance_idx(pVtab)) { + sqlite3_result_double( + context, pCur->knn_data->distances[pCur->knn_data->current_idx]); + return SQLITE_OK; + } + else if (vec0_column_idx_is_vector(pVtab, i)) { + void *out; + int sz; + int vector_idx = vec0_column_idx_to_vector_idx(pVtab, i); + int rc = vec0_get_vector_data( + pVtab, pCur->knn_data->rowids[pCur->knn_data->current_idx], vector_idx, + &out, &sz); + if (rc != SQLITE_OK) { + return rc; + } + sqlite3_result_blob(context, out, sz, sqlite3_free); + sqlite3_result_subtype(context, + pVtab->vector_columns[vector_idx].element_type); + return SQLITE_OK; + } + else if(vec0_column_idx_is_partition(pVtab, i)) { + int partition_idx = vec0_column_idx_to_partition_idx(pVtab, i); + i64 rowid = pCur->knn_data->rowids[pCur->knn_data->current_idx]; + sqlite3_value * v; + int rc = vec0_get_partition_value_for_rowid(pVtab, rowid, partition_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + else if(vec0_column_idx_is_auxiliary(pVtab, i)) { + int auxiliary_idx = vec0_column_idx_to_auxiliary_idx(pVtab, i); + i64 rowid = pCur->knn_data->rowids[pCur->knn_data->current_idx]; + sqlite3_value * v; + int rc = vec0_get_auxiliary_value_for_rowid(pVtab, rowid, auxiliary_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + + else if(vec0_column_idx_is_metadata(pVtab, i)) { + int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i); + i64 rowid = pCur->knn_data->rowids[pCur->knn_data->current_idx]; + int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context); + if(rc != SQLITE_OK) { + const char * zErr = sqlite3_mprintf( + "Could not extract metadata value for column %.*s at rowid %lld", + pVtab->metadata_columns[metadata_idx].name_length, + pVtab->metadata_columns[metadata_idx].name, rowid + ); + if(zErr) { + sqlite3_result_error(context, zErr, -1); + sqlite3_free((void *) zErr); + }else { + sqlite3_result_error_nomem(context); + } + } + } + + return SQLITE_OK; +} + +static int vec0Column(sqlite3_vtab_cursor *cur, sqlite3_context *context, + int i) { + vec0_cursor *pCur = (vec0_cursor *)cur; + vec0_vtab *pVtab = (vec0_vtab *)cur->pVtab; + switch (pCur->query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: { + return vec0Column_fullscan(pVtab, pCur, context, i); + } + case VEC0_QUERY_PLAN_KNN: { + return vec0Column_knn(pVtab, pCur, context, i); + } + case VEC0_QUERY_PLAN_POINT: { + return vec0Column_point(pVtab, pCur, context, i); + } + } + return SQLITE_OK; +} + +/** + * @brief Handles the "insert rowid" step of a row insert operation of a vec0 + * table. + * + * This function will insert a new row into the _rowids vec0 shadow table. + * + * @param p: virtual table + * @param idValue: Value containing the inserted rowid/id value. + * @param rowid: Output rowid, will point to the "real" i64 rowid + * value that was inserted + * @return int SQLITE_OK on success, error code on failure + */ +int vec0Update_InsertRowidStep(vec0_vtab *p, sqlite3_value *idValue, + i64 *rowid) { + + /** + * An insert into a vec0 table can happen a few different ways: + * 1) With default INTEGER primary key: With a supplied i64 rowid + * 2) With default INTEGER primary key: WITHOUT a supplied rowid + * 3) With TEXT primary key: supplied text rowid + */ + + int rc; + + // Option 3: vtab has a user-defined TEXT primary key, so ensure a text value + // is provided. + if (p->pkIsText) { + if (sqlite3_value_type(idValue) != SQLITE_TEXT) { + // IMP: V04200_21039 + vtab_set_error(&p->base, + "The %s virtual table was declared with a TEXT primary " + "key, but a non-TEXT value was provided in an INSERT.", + p->tableName); + return SQLITE_ERROR; + } + + return vec0_rowids_insert_id(p, idValue, rowid); + } + + // Option 1: User supplied a i64 rowid + if (sqlite3_value_type(idValue) == SQLITE_INTEGER) { + i64 suppliedRowid = sqlite3_value_int64(idValue); + rc = vec0_rowids_insert_rowid(p, suppliedRowid); + if (rc == SQLITE_OK) { + *rowid = suppliedRowid; + } + return rc; + } + + // Option 2: User did not suppled a rowid + + if (sqlite3_value_type(idValue) != SQLITE_NULL) { + // IMP: V30855_14925 + vtab_set_error(&p->base, + "Only integers are allows for primary key values on %s", + p->tableName); + return SQLITE_ERROR; + } + // NULL to get next auto-incremented value + return vec0_rowids_insert_id(p, NULL, rowid); +} + +/** + * @brief Determines the "next available" chunk position for a newly inserted + * vec0 row. + * + * This operation may insert a new "blank" chunk the _chunks table, if there is + * no more space in previous chunks. + * + * @param p: virtual table + * @param partitionKeyValues: array of partition key column values, to constrain + * against any partition key columns. + * @param chunk_rowid: Output rowid of the chunk in the _chunks virtual table + * that has the avialabiity. + * @param chunk_offset: Output the index of the available space insert the + * chunk, based on the index of the first available validity bit. + * @param pBlobValidity: Output blob of the validity column of the available + * chunk. Will be opened with read/write permissions. + * @param pValidity: Output buffer of the original chunk's validity column. + * Needs to be cleaned up with sqlite3_free(). + * @return int SQLITE_OK on success, error code on failure + */ +int vec0Update_InsertNextAvailableStep( + vec0_vtab *p, + sqlite3_value ** partitionKeyValues, + i64 *chunk_rowid, i64 *chunk_offset, + sqlite3_blob **blobChunksValidity, + const unsigned char **bufferChunksValidity) { + + int rc; + i64 validitySize; + *chunk_offset = -1; + + rc = vec0_get_latest_chunk_rowid(p, chunk_rowid, partitionKeyValues); + if(rc == SQLITE_EMPTY) { + goto done; + } + if (rc != SQLITE_OK) { + goto cleanup; + } + + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, "validity", + *chunk_rowid, 1, blobChunksValidity); + if (rc != SQLITE_OK) { + // IMP: V22053_06123 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not open validity blob on %s.%s.%lld", + p->schemaName, p->shadowChunksName, *chunk_rowid); + goto cleanup; + } + + validitySize = sqlite3_blob_bytes(*blobChunksValidity); + if (validitySize != p->chunk_size / CHAR_BIT) { + // IMP: V29362_13432 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "validity blob size mismatch on " + "%s.%s.%lld, expected %lld but received %lld.", + p->schemaName, p->shadowChunksName, *chunk_rowid, + (i64)(p->chunk_size / CHAR_BIT), validitySize); + rc = SQLITE_ERROR; + goto cleanup; + } + + *bufferChunksValidity = sqlite3_malloc(validitySize); + if (!(*bufferChunksValidity)) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "Could not allocate memory for validity bitmap"); + rc = SQLITE_NOMEM; + goto cleanup; + } + + rc = sqlite3_blob_read(*blobChunksValidity, (void *)*bufferChunksValidity, + validitySize, 0); + + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "Could not read validity bitmap for %s.%s.%lld", + p->schemaName, p->shadowChunksName, *chunk_rowid); + goto cleanup; + } + + // find the next available offset, ie first `0` in the bitmap. + for (int i = 0; i < validitySize; i++) { + if ((*bufferChunksValidity)[i] == 0b11111111) + continue; + for (int j = 0; j < CHAR_BIT; j++) { + if (((((*bufferChunksValidity)[i] >> j) & 1) == 0)) { + *chunk_offset = (i * CHAR_BIT) + j; + goto done; + } + } + } + +done: + // latest chunk was full, so need to create a new one + if (*chunk_offset == -1) { + rc = vec0_new_chunk(p, partitionKeyValues, chunk_rowid); + if (rc != SQLITE_OK) { + // IMP: V08441_25279 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR "Could not insert a new vector chunk"); + rc = SQLITE_ERROR; // otherwise raises a DatabaseError and not operational + // error? + goto cleanup; + } + *chunk_offset = 0; + + // blobChunksValidity and pValidity are stale, pointing to the previous + // (full) chunk. to re-assign them + rc = sqlite3_blob_close(*blobChunksValidity); + sqlite3_free((void *)*bufferChunksValidity); + *blobChunksValidity = NULL; + *bufferChunksValidity = NULL; + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "unknown error, blobChunksValidity could not be closed, " + "please file an issue."); + rc = SQLITE_ERROR; + goto cleanup; + } + + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, + "validity", *chunk_rowid, 1, blobChunksValidity); + if (rc != SQLITE_OK) { + vtab_set_error( + &p->base, + VEC_INTERAL_ERROR + "Could not open validity blob for newly created chunk %s.%s.%lld", + p->schemaName, p->shadowChunksName, *chunk_rowid); + goto cleanup; + } + validitySize = sqlite3_blob_bytes(*blobChunksValidity); + if (validitySize != p->chunk_size / CHAR_BIT) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "validity blob size mismatch for newly created chunk " + "%s.%s.%lld. Exepcted %lld, got %lld", + p->schemaName, p->shadowChunksName, *chunk_rowid, + p->chunk_size / CHAR_BIT, validitySize); + goto cleanup; + } + *bufferChunksValidity = sqlite3_malloc(validitySize); + rc = sqlite3_blob_read(*blobChunksValidity, (void *)*bufferChunksValidity, + validitySize, 0); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not read validity blob newly created chunk " + "%s.%s.%lld", + p->schemaName, p->shadowChunksName, *chunk_rowid); + goto cleanup; + } + } + + rc = SQLITE_OK; + +cleanup: + return rc; +} + +/** + * @brief Write the vector data into the provided vector blob at the given + * offset + * + * @param blobVectors SQLite BLOB to write to + * @param chunk_offset the "offset" (ie validity bitmap position) to write the + * vector to + * @param bVector pointer to the vector containing data + * @param dimensions how many dimensions the vector has + * @param element_type the vector type + * @return result of sqlite3_blob_write, SQLITE_OK on success, otherwise failure + */ +static int +vec0_write_vector_to_vector_blob(sqlite3_blob *blobVectors, i64 chunk_offset, + const void *bVector, size_t dimensions, + enum VectorElementType element_type) { + int n; + int offset; + + switch (element_type) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: + n = dimensions * sizeof(f32); + offset = chunk_offset * dimensions * sizeof(f32); + break; + case SQLITE_VEC_ELEMENT_TYPE_INT8: + n = dimensions * sizeof(i8); + offset = chunk_offset * dimensions * sizeof(i8); + break; + case SQLITE_VEC_ELEMENT_TYPE_BIT: + n = dimensions / CHAR_BIT; + offset = chunk_offset * dimensions / CHAR_BIT; + break; + } + + return sqlite3_blob_write(blobVectors, bVector, n, offset); +} + +/** + * @brief + * + * @param p vec0 virtual table + * @param chunk_rowid: which chunk to write to + * @param chunk_offset: the offset inside the chunk to write the vector to. + * @param rowid: the rowid of the inserting row + * @param vectorDatas: array of the vector data to insert + * @param blobValidity: writeable validity blob of the row's assigned chunk. + * @param validity: snapshot buffer of the valdity column from the row's + * assigned chunk. + * @return int SQLITE_OK on success, error code on failure + */ +int vec0Update_InsertWriteFinalStep(vec0_vtab *p, i64 chunk_rowid, + i64 chunk_offset, i64 rowid, + void *vectorDatas[], + sqlite3_blob *blobChunksValidity, + const unsigned char *bufferChunksValidity) { + int rc, brc; + sqlite3_blob *blobChunksRowids = NULL; + + // mark the validity bit for this row in the chunk's validity bitmap + // Get the byte offset of the bitmap + char unsigned bx = bufferChunksValidity[chunk_offset / CHAR_BIT]; + // set the bit at the chunk_offset position inside that byte + bx = bx | (1 << (chunk_offset % CHAR_BIT)); + // write that 1 byte + rc = sqlite3_blob_write(blobChunksValidity, &bx, 1, chunk_offset / CHAR_BIT); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR "could not mark validity bit "); + return rc; + } + + // Go insert the vector data into the vector chunk shadow tables + for (int i = 0; i < p->numVectorColumns; i++) { + sqlite3_blob *blobVectors; + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowVectorChunksNames[i], + "vectors", chunk_rowid, 1, &blobVectors); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "Error opening vector blob at %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid); + goto cleanup; + } + + i64 expected = + p->chunk_size * vector_column_byte_size(p->vector_columns[i]); + i64 actual = sqlite3_blob_bytes(blobVectors); + + if (actual != expected) { + // IMP: V16386_00456 + vtab_set_error( + &p->base, + VEC_INTERAL_ERROR + "vector blob size mismatch on %s.%s.%lld. Expected %lld, actual %lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid, expected, + actual); + rc = SQLITE_ERROR; + // already error, can ignore result code + sqlite3_blob_close(blobVectors); + goto cleanup; + }; + + rc = vec0_write_vector_to_vector_blob( + blobVectors, chunk_offset, vectorDatas[i], + p->vector_columns[i].dimensions, p->vector_columns[i].element_type); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not write vector blob on %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid); + rc = SQLITE_ERROR; + // already error, can ignore result code + sqlite3_blob_close(blobVectors); + goto cleanup; + } + rc = sqlite3_blob_close(blobVectors); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not close vector blob on %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid); + rc = SQLITE_ERROR; + goto cleanup; + } + } + + // write the new rowid to the rowids column of the _chunks table + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, "rowids", + chunk_rowid, 1, &blobChunksRowids); + if (rc != SQLITE_OK) { + // IMP: V09221_26060 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR "could not open rowids blob on %s.%s.%lld", + p->schemaName, p->shadowChunksName, chunk_rowid); + goto cleanup; + } + i64 expected = p->chunk_size * sizeof(i64); + i64 actual = sqlite3_blob_bytes(blobChunksRowids); + if (expected != actual) { + // IMP: V12779_29618 + vtab_set_error( + &p->base, + VEC_INTERAL_ERROR + "rowids blob size mismatch on %s.%s.%lld. Expected %lld, actual %lld", + p->schemaName, p->shadowChunksName, chunk_rowid, expected, actual); + rc = SQLITE_ERROR; + goto cleanup; + } + rc = sqlite3_blob_write(blobChunksRowids, &rowid, sizeof(i64), + chunk_offset * sizeof(i64)); + if (rc != SQLITE_OK) { + vtab_set_error( + &p->base, VEC_INTERAL_ERROR "could not write rowids blob on %s.%s.%lld", + p->schemaName, p->shadowChunksName, chunk_rowid); + rc = SQLITE_ERROR; + goto cleanup; + } + + // Now with all the vectors inserted, go back and update the _rowids table + // with the new chunk_rowid/chunk_offset values + rc = vec0_rowids_update_position(p, rowid, chunk_rowid, chunk_offset); + +cleanup: + brc = sqlite3_blob_close(blobChunksRowids); + if ((rc == SQLITE_OK) && (brc != SQLITE_OK)) { + vtab_set_error( + &p->base, VEC_INTERAL_ERROR "could not close rowids blob on %s.%s.%lld", + p->schemaName, p->shadowChunksName, chunk_rowid); + return brc; + } + return rc; +} + +int vec0_write_metadata_value(vec0_vtab *p, int metadata_column_idx, i64 rowid, i64 chunk_id, i64 chunk_offset, sqlite3_value * v, int isupdate) { + int rc; + struct Vec0MetadataColumnDefinition * metadata_column = &p->metadata_columns[metadata_column_idx]; + vec0_metadata_column_kind kind = metadata_column->kind; + + // verify input value matches column type + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + if(sqlite3_value_type(v) != SQLITE_INTEGER || ((sqlite3_value_int(v) != 0) && (sqlite3_value_int(v) != 1))) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected 0 or 1 for BOOLEAN metadata column %.*s", metadata_column->name_length, metadata_column->name); + goto done; + } + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + if(sqlite3_value_type(v) != SQLITE_INTEGER) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected integer for INTEGER metadata column %.*s, received %s", metadata_column->name_length, metadata_column->name, type_name(sqlite3_value_type(v))); + goto done; + } + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + if(sqlite3_value_type(v) != SQLITE_FLOAT) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected float for FLOAT metadata column %.*s, received %s", metadata_column->name_length, metadata_column->name, type_name(sqlite3_value_type(v))); + goto done; + } + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + if(sqlite3_value_type(v) != SQLITE_TEXT) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected text for TEXT metadata column %.*s, received %s", metadata_column->name_length, metadata_column->name, type_name(sqlite3_value_type(v))); + goto done; + } + break; + } + } + + sqlite3_blob * blobValue = NULL; + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_column_idx], "data", chunk_id, 1, &blobValue); + if(rc != SQLITE_OK) { + goto done; + } + + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + u8 block; + int value = sqlite3_value_int(v); + rc = sqlite3_blob_read(blobValue, &block, sizeof(u8), (int) (chunk_offset / CHAR_BIT)); + if(rc != SQLITE_OK) { + goto done; + } + + if (value) { + block |= 1 << (chunk_offset % CHAR_BIT); + } else { + block &= ~(1 << (chunk_offset % CHAR_BIT)); + } + + rc = sqlite3_blob_write(blobValue, &block, sizeof(u8), chunk_offset / CHAR_BIT); + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + i64 value = sqlite3_value_int64(v); + rc = sqlite3_blob_write(blobValue, &value, sizeof(value), chunk_offset * sizeof(i64)); + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + double value = sqlite3_value_double(v); + rc = sqlite3_blob_write(blobValue, &value, sizeof(value), chunk_offset * sizeof(double)); + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + int prev_n; + rc = sqlite3_blob_read(blobValue, &prev_n, sizeof(int), chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(rc != SQLITE_OK) { + goto done; + } + + const char * s = (const char *) sqlite3_value_text(v); + int n = sqlite3_value_bytes(v); + u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + memset(view, 0, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + memcpy(view, &n, sizeof(int)); + memcpy(view+4, s, min(n, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH-4)); + + rc = sqlite3_blob_write(blobValue, &view, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH, chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + const char * zSql; + + if(isupdate && (prev_n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH)) { + zSql = sqlite3_mprintf("UPDATE " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " SET data = ?2 WHERE rowid = ?1", p->schemaName, p->tableName, metadata_column_idx); + }else { + zSql = sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " (rowid, data) VALUES (?1, ?2)", p->schemaName, p->tableName, metadata_column_idx); + } + if(!zSql) { + rc = SQLITE_NOMEM; + goto done; + } + sqlite3_stmt * stmt; + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_bind_int64(stmt, 1, rowid); + sqlite3_bind_text(stmt, 2, s, n, SQLITE_STATIC); + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + + if(rc != SQLITE_DONE) { + rc = SQLITE_ERROR; + goto done; + } + } + else if(prev_n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + const char * zSql = sqlite3_mprintf("DELETE FROM " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " WHERE rowid = ?", p->schemaName, p->tableName, metadata_column_idx); + if(!zSql) { + rc = SQLITE_NOMEM; + goto done; + } + sqlite3_stmt * stmt; + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + + if(rc != SQLITE_DONE) { + rc = SQLITE_ERROR; + goto done; + } + } + break; + } + } + + if(rc != SQLITE_OK) { + + } + rc = sqlite3_blob_close(blobValue); + if(rc != SQLITE_OK) { + goto done; + } + + done: + return rc; +} + + +/** + * @brief Handles INSERT INTO operations on a vec0 table. + * + * @return int SQLITE_OK on success, otherwise error code on failure + */ +int vec0Update_Insert(sqlite3_vtab *pVTab, int argc, sqlite3_value **argv, + sqlite_int64 *pRowid) { + UNUSED_PARAMETER(argc); + vec0_vtab *p = (vec0_vtab *)pVTab; + int rc; + // Rowid for the inserted row, deterimined by the inserted ID + _rowids shadow + // table + i64 rowid; + + // Array to hold the vector data of the inserted row. Individual elements will + // have a lifetime bound to the argv[..] values. + void *vectorDatas[VEC0_MAX_VECTOR_COLUMNS]; + // Array to hold cleanup functions for vectorDatas[] + vector_cleanup cleanups[VEC0_MAX_VECTOR_COLUMNS]; + + sqlite3_value * partitionKeyValues[VEC0_MAX_PARTITION_COLUMNS]; + + // Rowid of the chunk in the _chunks shadow table that the row will be a part + // of. + i64 chunk_rowid; + // offset within the chunk where the rowid belongs + i64 chunk_offset; + + // a write-able blob of the validity column for the given chunk. Used to mark + // validity bit + sqlite3_blob *blobChunksValidity = NULL; + // buffer for the valididty column for the given chunk. Maybe not needed here? + const unsigned char *bufferChunksValidity = NULL; + int numReadVectors = 0; + + // Read all provided partition key values into partitionKeyValues + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_PARTITION) { + continue; + } + int partition_key_idx = p->user_column_idxs[i]; + partitionKeyValues[partition_key_idx] = argv[2+VEC0_COLUMN_USERN_START + i]; + + int new_value_type = sqlite3_value_type(partitionKeyValues[partition_key_idx]); + if((new_value_type != SQLITE_NULL) && (new_value_type != p->paritition_columns[partition_key_idx].type)) { + // IMP: V11454_28292 + vtab_set_error( + pVTab, + "Parition key type mismatch: The partition key column %.*s has type %s, but %s was provided.", + p->paritition_columns[partition_key_idx].name_length, + p->paritition_columns[partition_key_idx].name, + type_name(p->paritition_columns[partition_key_idx].type), + type_name(new_value_type) + ); + rc = SQLITE_ERROR; + goto cleanup; + } + } + + // read all the inserted vectors into vectorDatas, validate their lengths. + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_VECTOR) { + continue; + } + int vector_column_idx = p->user_column_idxs[i]; + sqlite3_value *valueVector = argv[2 + VEC0_COLUMN_USERN_START + i]; + size_t dimensions; + + char *pzError; + enum VectorElementType elementType; + rc = vector_from_value(valueVector, &vectorDatas[vector_column_idx], &dimensions, + &elementType, &cleanups[vector_column_idx], &pzError); + if (rc != SQLITE_OK) { + // IMP: V06519_23358 + vtab_set_error( + pVTab, "Inserted vector for the \"%.*s\" column is invalid: %z", + p->vector_columns[vector_column_idx].name_length, p->vector_columns[vector_column_idx].name, pzError); + rc = SQLITE_ERROR; + goto cleanup; + } + + numReadVectors++; + if (elementType != p->vector_columns[vector_column_idx].element_type) { + // IMP: V08221_25059 + vtab_set_error( + pVTab, + "Inserted vector for the \"%.*s\" column is expected to be of type " + "%s, but a %s vector was provided.", + p->vector_columns[i].name_length, p->vector_columns[i].name, + vector_subtype_name(p->vector_columns[i].element_type), + vector_subtype_name(elementType)); + rc = SQLITE_ERROR; + goto cleanup; + } + + if (dimensions != p->vector_columns[vector_column_idx].dimensions) { + // IMP: V01145_17984 + vtab_set_error( + pVTab, + "Dimension mismatch for inserted vector for the \"%.*s\" column. " + "Expected %d dimensions but received %d.", + p->vector_columns[vector_column_idx].name_length, p->vector_columns[vector_column_idx].name, + p->vector_columns[vector_column_idx].dimensions, dimensions); + rc = SQLITE_ERROR; + goto cleanup; + } + } + + // Cannot insert a value in the hidden "distance" column + if (sqlite3_value_type(argv[2 + vec0_column_distance_idx(p)]) != + SQLITE_NULL) { + // IMP: V24228_08298 + vtab_set_error(pVTab, + "A value was provided for the hidden \"distance\" column."); + rc = SQLITE_ERROR; + goto cleanup; + } + // Cannot insert a value in the hidden "k" column + if (sqlite3_value_type(argv[2 + vec0_column_k_idx(p)]) != SQLITE_NULL) { + // IMP: V11875_28713 + vtab_set_error(pVTab, "A value was provided for the hidden \"k\" column."); + rc = SQLITE_ERROR; + goto cleanup; + } + + // Step #1: Insert/get a rowid for this row, from the _rowids table. + rc = vec0Update_InsertRowidStep(p, argv[2 + VEC0_COLUMN_ID], &rowid); + if (rc != SQLITE_OK) { + goto cleanup; + } + + // Step #2: Find the next "available" position in the _chunks table for this + // row. + rc = vec0Update_InsertNextAvailableStep(p, partitionKeyValues, + &chunk_rowid, &chunk_offset, + &blobChunksValidity, + &bufferChunksValidity); + if (rc != SQLITE_OK) { + goto cleanup; + } + + // Step #3: With the next available chunk position, write out all the vectors + // to their specified location. + rc = vec0Update_InsertWriteFinalStep(p, chunk_rowid, chunk_offset, rowid, + vectorDatas, blobChunksValidity, + bufferChunksValidity); + if (rc != SQLITE_OK) { + goto cleanup; + } + + if(p->numAuxiliaryColumns > 0) { + sqlite3_stmt *stmt; + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "INSERT INTO " VEC0_SHADOW_AUXILIARY_NAME "(rowid ", p->schemaName, p->tableName); + for(int i = 0; i < p->numAuxiliaryColumns; i++) { + sqlite3_str_appendf(s, ", value%02d", i); + } + sqlite3_str_appendall(s, ") VALUES (? "); + for(int i = 0; i < p->numAuxiliaryColumns; i++) { + sqlite3_str_appendall(s, ", ?"); + } + sqlite3_str_appendall(s, ")"); + char * zSql = sqlite3_str_finish(s); + // TODO double check error handling ehre + if(!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_bind_int64(stmt, 1, rowid); + + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY) { + continue; + } + int auxiliary_key_idx = p->user_column_idxs[i]; + sqlite3_value * v = argv[2+VEC0_COLUMN_USERN_START + i]; + int v_type = sqlite3_value_type(v); + if(v_type != SQLITE_NULL && (v_type != p->auxiliary_columns[auxiliary_key_idx].type)) { + sqlite3_finalize(stmt); + rc = SQLITE_CONSTRAINT; + vtab_set_error( + pVTab, + "Auxiliary column type mismatch: The auxiliary column %.*s has type %s, but %s was provided.", + p->auxiliary_columns[auxiliary_key_idx].name_length, + p->auxiliary_columns[auxiliary_key_idx].name, + type_name(p->auxiliary_columns[auxiliary_key_idx].type), + type_name(v_type) + ); + goto cleanup; + } + // first 1 is for 1-based indexing on sqlite3_bind_*, second 1 is to account for initial rowid parameter + sqlite3_bind_value(stmt, 1 + 1 + auxiliary_key_idx, v); + } + + rc = sqlite3_step(stmt); + if(rc != SQLITE_DONE) { + sqlite3_finalize(stmt); + rc = SQLITE_ERROR; + goto cleanup; + } + sqlite3_finalize(stmt); + } + + + for(int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_METADATA) { + continue; + } + int metadata_idx = p->user_column_idxs[i]; + sqlite3_value *v = argv[2 + VEC0_COLUMN_USERN_START + i]; + rc = vec0_write_metadata_value(p, metadata_idx, rowid, chunk_rowid, chunk_offset, v, 0); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + + *pRowid = rowid; + rc = SQLITE_OK; + +cleanup: + for (int i = 0; i < numReadVectors; i++) { + cleanups[i](vectorDatas[i]); + } + sqlite3_free((void *)bufferChunksValidity); + int brc = sqlite3_blob_close(blobChunksValidity); + if ((rc == SQLITE_OK) && (brc != SQLITE_OK)) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR "unknown error, blobChunksValidity could " + "not be closed, please file an issue"); + return brc; + } + return rc; +} + +int vec0Update_Delete_ClearValidity(vec0_vtab *p, i64 chunk_id, + u64 chunk_offset) { + int rc, brc; + sqlite3_blob *blobChunksValidity = NULL; + char unsigned bx; + int validityOffset = chunk_offset / CHAR_BIT; + + // 2. ensure chunks.validity bit is 1, then set to 0 + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, "validity", + chunk_id, 1, &blobChunksValidity); + if (rc != SQLITE_OK) { + // IMP: V26002_10073 + vtab_set_error(&p->base, "could not open validity blob for %s.%s.%lld", + p->schemaName, p->shadowChunksName, chunk_id); + return SQLITE_ERROR; + } + // will skip the sqlite3_blob_bytes(blobChunksValidity) check for now, + // the read below would catch it + + rc = sqlite3_blob_read(blobChunksValidity, &bx, sizeof(bx), validityOffset); + if (rc != SQLITE_OK) { + // IMP: V21193_05263 + vtab_set_error( + &p->base, "could not read validity blob for %s.%s.%lld at %d", + p->schemaName, p->shadowChunksName, chunk_id, validityOffset); + goto cleanup; + } + if (!(bx >> (chunk_offset % CHAR_BIT))) { + // IMP: V21193_05263 + rc = SQLITE_ERROR; + vtab_set_error( + &p->base, + "vec0 deletion error: validity bit is not set for %s.%s.%lld at %d", + p->schemaName, p->shadowChunksName, chunk_id, validityOffset); + goto cleanup; + } + char unsigned mask = ~(1 << (chunk_offset % CHAR_BIT)); + char result = bx & mask; + rc = sqlite3_blob_write(blobChunksValidity, &result, sizeof(bx), + validityOffset); + if (rc != SQLITE_OK) { + vtab_set_error( + &p->base, "could not write to validity blob for %s.%s.%lld at %d", + p->schemaName, p->shadowChunksName, chunk_id, validityOffset); + goto cleanup; + } + +cleanup: + + brc = sqlite3_blob_close(blobChunksValidity); + if (rc != SQLITE_OK) + return rc; + if (brc != SQLITE_OK) { + vtab_set_error(&p->base, + "vec0 deletion error: Error commiting validity blob " + "transaction on %s.%s.%lld at %d", + p->schemaName, p->shadowChunksName, chunk_id, + validityOffset); + return brc; + } + return SQLITE_OK; +} + +int vec0Update_Delete_DeleteRowids(vec0_vtab *p, i64 rowid) { + int rc; + sqlite3_stmt *stmt = NULL; + + char *zSql = + sqlite3_mprintf("DELETE FROM " VEC0_SHADOW_ROWIDS_NAME " WHERE rowid = ?", + p->schemaName, p->tableName); + if (!zSql) { + return SQLITE_NOMEM; + } + + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + goto cleanup; + } + rc = SQLITE_OK; + +cleanup: + sqlite3_finalize(stmt); + return rc; +} + +int vec0Update_Delete_DeleteAux(vec0_vtab *p, i64 rowid) { + int rc; + sqlite3_stmt *stmt = NULL; + + char *zSql = + sqlite3_mprintf("DELETE FROM " VEC0_SHADOW_AUXILIARY_NAME " WHERE rowid = ?", + p->schemaName, p->tableName); + if (!zSql) { + return SQLITE_NOMEM; + } + + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + goto cleanup; + } + rc = SQLITE_OK; + +cleanup: + sqlite3_finalize(stmt); + return rc; +} + +int vec0Update_Delete_ClearMetadata(vec0_vtab *p, int metadata_idx, i64 rowid, i64 chunk_id, + u64 chunk_offset) { + int rc; + sqlite3_blob * blobValue; + vec0_metadata_column_kind kind = p->metadata_columns[metadata_idx].kind; + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_idx], "data", chunk_id, 1, &blobValue); + if(rc != SQLITE_OK) { + return rc; + } + + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + u8 block; + rc = sqlite3_blob_read(blobValue, &block, sizeof(u8), (int) (chunk_offset / CHAR_BIT)); + if(rc != SQLITE_OK) { + goto done; + } + + block &= ~(1 << (chunk_offset % CHAR_BIT)); + rc = sqlite3_blob_write(blobValue, &block, sizeof(u8), chunk_offset / CHAR_BIT); + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + i64 v = 0; + rc = sqlite3_blob_write(blobValue, &v, sizeof(v), chunk_offset * sizeof(i64)); + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + double v = 0; + rc = sqlite3_blob_write(blobValue, &v, sizeof(v), chunk_offset * sizeof(double)); + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + int n; + rc = sqlite3_blob_read(blobValue, &n, sizeof(int), chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(rc != SQLITE_OK) { + goto done; + } + + u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + memset(view, 0, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + rc = sqlite3_blob_write(blobValue, &view, sizeof(view), chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(rc != SQLITE_OK) { + goto done; + } + + if(n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + const char * zSql = sqlite3_mprintf("DELETE FROM " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " WHERE rowid = ?", p->schemaName, p->tableName, metadata_idx); + if(!zSql) { + rc = SQLITE_NOMEM; + goto done; + } + sqlite3_stmt * stmt; + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if(rc != SQLITE_DONE) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + } + break; + } + } + int rc2; + done: + rc2 = sqlite3_blob_close(blobValue); + if(rc == SQLITE_OK) { + return rc2; + } + return rc; +} + +int vec0Update_Delete(sqlite3_vtab *pVTab, sqlite3_value *idValue) { + vec0_vtab *p = (vec0_vtab *)pVTab; + int rc; + i64 rowid; + i64 chunk_id; + i64 chunk_offset; + + if (p->pkIsText) { + rc = vec0_rowid_from_id(p, idValue, &rowid); + if (rc != SQLITE_OK) { + return rc; + } + } else { + rowid = sqlite3_value_int64(idValue); + } + + // 1. Find chunk position for given rowid + // 2. Ensure that validity bit for position is 1, then set to 0 + // 3. Zero out rowid in chunks.rowid + // 4. Zero out vector data in all vector column chunks + // 5. Delete value in _rowids table + + // 1. get chunk_id and chunk_offset from _rowids + rc = vec0_get_chunk_position(p, rowid, NULL, &chunk_id, &chunk_offset); + if (rc != SQLITE_OK) { + return rc; + } + + rc = vec0Update_Delete_ClearValidity(p, chunk_id, chunk_offset); + if (rc != SQLITE_OK) { + return rc; + } + + // 3. zero out rowid in chunks.rowids + // https://github.com/asg017/sqlite-vec/issues/54 + + // 4. zero out any data in vector chunks tables + // https://github.com/asg017/sqlite-vec/issues/54 + + // 5. delete from _rowids table + rc = vec0Update_Delete_DeleteRowids(p, rowid); + if (rc != SQLITE_OK) { + return rc; + } + + // 6. delete any auxiliary rows + if(p->numAuxiliaryColumns > 0) { + rc = vec0Update_Delete_DeleteAux(p, rowid); + if (rc != SQLITE_OK) { + return rc; + } + } + + // 6. delete metadata + for(int i = 0; i < p->numMetadataColumns; i++) { + rc = vec0Update_Delete_ClearMetadata(p, i, rowid, chunk_id, chunk_offset); + } + + return SQLITE_OK; +} + +int vec0Update_UpdateAuxColumn(vec0_vtab *p, int auxiliary_column_idx, sqlite3_value * value, i64 rowid) { + int rc; + sqlite3_stmt *stmt; + const char * zSql = sqlite3_mprintf("UPDATE " VEC0_SHADOW_AUXILIARY_NAME " SET value%02d = ? WHERE rowid = ?", p->schemaName, p->tableName, auxiliary_column_idx); + if(!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_bind_value(stmt, 1, value); + sqlite3_bind_int64(stmt, 2, rowid); + rc = sqlite3_step(stmt); + if(rc != SQLITE_DONE) { + sqlite3_finalize(stmt); + return SQLITE_ERROR; + } + sqlite3_finalize(stmt); + return SQLITE_OK; +} + +int vec0Update_UpdateVectorColumn(vec0_vtab *p, i64 chunk_id, i64 chunk_offset, + int i, sqlite3_value *valueVector) { + int rc; + + sqlite3_blob *blobVectors = NULL; + + char *pzError; + size_t dimensions; + enum VectorElementType elementType; + void *vector; + vector_cleanup cleanup = vector_cleanup_noop; + // https://github.com/asg017/sqlite-vec/issues/53 + rc = vector_from_value(valueVector, &vector, &dimensions, &elementType, + &cleanup, &pzError); + if (rc != SQLITE_OK) { + // IMP: V15203_32042 + vtab_set_error( + &p->base, "Updated vector for the \"%.*s\" column is invalid: %z", + p->vector_columns[i].name_length, p->vector_columns[i].name, pzError); + rc = SQLITE_ERROR; + goto cleanup; + } + if (elementType != p->vector_columns[i].element_type) { + // IMP: V03643_20481 + vtab_set_error( + &p->base, + "Updated vector for the \"%.*s\" column is expected to be of type " + "%s, but a %s vector was provided.", + p->vector_columns[i].name_length, p->vector_columns[i].name, + vector_subtype_name(p->vector_columns[i].element_type), + vector_subtype_name(elementType)); + rc = SQLITE_ERROR; + goto cleanup; + } + if (dimensions != p->vector_columns[i].dimensions) { + // IMP: V25739_09810 + vtab_set_error( + &p->base, + "Dimension mismatch for new updated vector for the \"%.*s\" column. " + "Expected %d dimensions but received %d.", + p->vector_columns[i].name_length, p->vector_columns[i].name, + p->vector_columns[i].dimensions, dimensions); + rc = SQLITE_ERROR; + goto cleanup; + } + + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowVectorChunksNames[i], + "vectors", chunk_id, 1, &blobVectors); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "Could not open vectors blob for %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_id); + goto cleanup; + } + rc = vec0_write_vector_to_vector_blob(blobVectors, chunk_offset, vector, + p->vector_columns[i].dimensions, + p->vector_columns[i].element_type); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "Could not write to vectors blob for %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_id); + goto cleanup; + } + +cleanup: + cleanup(vector); + int brc = sqlite3_blob_close(blobVectors); + if (rc != SQLITE_OK) { + return rc; + } + if (brc != SQLITE_OK) { + vtab_set_error( + &p->base, + "Could not commit blob transaction for vectors blob for %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_id); + return brc; + } + return SQLITE_OK; +} + +int vec0Update_Update(sqlite3_vtab *pVTab, int argc, sqlite3_value **argv) { + UNUSED_PARAMETER(argc); + vec0_vtab *p = (vec0_vtab *)pVTab; + int rc; + i64 chunk_id; + i64 chunk_offset; + + i64 rowid; + if (p->pkIsText) { + const char *a = (const char *)sqlite3_value_text(argv[0]); + const char *b = (const char *)sqlite3_value_text(argv[1]); + // IMP: V08886_25725 + if ((sqlite3_value_bytes(argv[0]) != sqlite3_value_bytes(argv[1])) || + strncmp(a, b, sqlite3_value_bytes(argv[0])) != 0) { + vtab_set_error(pVTab, + "UPDATEs on vec0 primary key values are not allowed."); + return SQLITE_ERROR; + } + rc = vec0_rowid_from_id(p, argv[0], &rowid); + if (rc != SQLITE_OK) { + return rc; + } + } else { + rowid = sqlite3_value_int64(argv[0]); + } + + // 1) get chunk_id and chunk_offset from _rowids + rc = vec0_get_chunk_position(p, rowid, NULL, &chunk_id, &chunk_offset); + if (rc != SQLITE_OK) { + return rc; + } + + // 2) update any partition key values + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_PARTITION) { + continue; + } + sqlite3_value * value = argv[2+VEC0_COLUMN_USERN_START + i]; + if(sqlite3_value_nochange(value)) { + continue; + } + vtab_set_error(pVTab, "UPDATE on partition key columns are not supported yet. "); + return SQLITE_ERROR; + } + + // 3) handle auxiliary column updates + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY) { + continue; + } + int auxiliary_column_idx = p->user_column_idxs[i]; + sqlite3_value * value = argv[2+VEC0_COLUMN_USERN_START + i]; + if(sqlite3_value_nochange(value)) { + continue; + } + rc = vec0Update_UpdateAuxColumn(p, auxiliary_column_idx, value, rowid); + if(rc != SQLITE_OK) { + return SQLITE_ERROR; + } + } + + // 4) handle metadata column updates + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_METADATA) { + continue; + } + int metadata_column_idx = p->user_column_idxs[i]; + sqlite3_value * value = argv[2+VEC0_COLUMN_USERN_START + i]; + if(sqlite3_value_nochange(value)) { + continue; + } + rc = vec0_write_metadata_value(p, metadata_column_idx, rowid, chunk_id, chunk_offset, value, 1); + if(rc != SQLITE_OK) { + return rc; + } + } + + // 5) iterate over all new vectors, update the vectors + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_VECTOR) { + continue; + } + int vector_idx = p->user_column_idxs[i]; + sqlite3_value *valueVector = argv[2 + VEC0_COLUMN_USERN_START + i]; + // in vec0Column, we check sqlite3_vtab_nochange() on vector columns. + // If the vector column isn't being changed, we return NULL; + // That's not great, that means vector columns can never be NULLABLE + // (bc we cant distinguish if an updated vector is truly NULL or nochange). + // Also it means that if someone tries to run `UPDATE v SET X = NULL`, + // we can't effectively detect and raise an error. + // A better solution would be to use a custom result_type for "empty", + // but subtypes don't appear to survive xColumn -> xUpdate, it's always 0. + // So for now, we'll just use NULL and warn people to not SET X = NULL + // in the docs. + if (sqlite3_value_type(valueVector) == SQLITE_NULL) { + continue; + } + + rc = vec0Update_UpdateVectorColumn(p, chunk_id, chunk_offset, vector_idx, + valueVector); + if (rc != SQLITE_OK) { + return SQLITE_ERROR; + } + } + + return SQLITE_OK; +} + +static int vec0Update(sqlite3_vtab *pVTab, int argc, sqlite3_value **argv, + sqlite_int64 *pRowid) { + // DELETE operation + if (argc == 1 && sqlite3_value_type(argv[0]) != SQLITE_NULL) { + return vec0Update_Delete(pVTab, argv[0]); + } + // INSERT operation + else if (argc > 1 && sqlite3_value_type(argv[0]) == SQLITE_NULL) { + return vec0Update_Insert(pVTab, argc, argv, pRowid); + } + // UPDATE operation + else if (argc > 1 && sqlite3_value_type(argv[0]) != SQLITE_NULL) { + return vec0Update_Update(pVTab, argc, argv); + } else { + vtab_set_error(pVTab, "Unrecognized xUpdate operation provided for vec0."); + return SQLITE_ERROR; + } +} + +static int vec0ShadowName(const char *zName) { + static const char *azName[] = { + "rowids", "chunks", "auxiliary", "info", + + // Up to VEC0_MAX_METADATA_COLUMNS + // TODO be smarter about this man + "metadatachunks00", + "metadatachunks01", + "metadatachunks02", + "metadatachunks03", + "metadatachunks04", + "metadatachunks05", + "metadatachunks06", + "metadatachunks07", + "metadatachunks08", + "metadatachunks09", + "metadatachunks10", + "metadatachunks11", + "metadatachunks12", + "metadatachunks13", + "metadatachunks14", + "metadatachunks15", + + // Up to + "metadatatext00", + "metadatatext01", + "metadatatext02", + "metadatatext03", + "metadatatext04", + "metadatatext05", + "metadatatext06", + "metadatatext07", + "metadatatext08", + "metadatatext09", + "metadatatext10", + "metadatatext11", + "metadatatext12", + "metadatatext13", + "metadatatext14", + "metadatatext15", + }; + + for (size_t i = 0; i < sizeof(azName) / sizeof(azName[0]); i++) { + if (sqlite3_stricmp(zName, azName[i]) == 0) + return 1; + } + //for(size_t i = 0; i < )"vector_chunks", "metadatachunks" + return 0; +} + +static int vec0Begin(sqlite3_vtab *pVTab) { + UNUSED_PARAMETER(pVTab); + return SQLITE_OK; +} +static int vec0Sync(sqlite3_vtab *pVTab) { + UNUSED_PARAMETER(pVTab); + vec0_vtab *p = (vec0_vtab *)pVTab; + if (p->stmtLatestChunk) { + sqlite3_finalize(p->stmtLatestChunk); + p->stmtLatestChunk = NULL; + } + if (p->stmtRowidsInsertRowid) { + sqlite3_finalize(p->stmtRowidsInsertRowid); + p->stmtRowidsInsertRowid = NULL; + } + if (p->stmtRowidsInsertId) { + sqlite3_finalize(p->stmtRowidsInsertId); + p->stmtRowidsInsertId = NULL; + } + if (p->stmtRowidsUpdatePosition) { + sqlite3_finalize(p->stmtRowidsUpdatePosition); + p->stmtRowidsUpdatePosition = NULL; + } + if (p->stmtRowidsGetChunkPosition) { + sqlite3_finalize(p->stmtRowidsGetChunkPosition); + p->stmtRowidsGetChunkPosition = NULL; + } + return SQLITE_OK; +} +static int vec0Commit(sqlite3_vtab *pVTab) { + UNUSED_PARAMETER(pVTab); + return SQLITE_OK; +} +static int vec0Rollback(sqlite3_vtab *pVTab) { + UNUSED_PARAMETER(pVTab); + return SQLITE_OK; +} + +static sqlite3_module vec0Module = { + /* iVersion */ 3, + /* xCreate */ vec0Create, + /* xConnect */ vec0Connect, + /* xBestIndex */ vec0BestIndex, + /* xDisconnect */ vec0Disconnect, + /* xDestroy */ vec0Destroy, + /* xOpen */ vec0Open, + /* xClose */ vec0Close, + /* xFilter */ vec0Filter, + /* xNext */ vec0Next, + /* xEof */ vec0Eof, + /* xColumn */ vec0Column, + /* xRowid */ vec0Rowid, + /* xUpdate */ vec0Update, + /* xBegin */ vec0Begin, + /* xSync */ vec0Sync, + /* xCommit */ vec0Commit, + /* xRollback */ vec0Rollback, + /* xFindFunction */ 0, + /* xRename */ 0, // https://github.com/asg017/sqlite-vec/issues/43 + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ vec0ShadowName, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0, // https://github.com/asg017/sqlite-vec/issues/44 +#endif +}; +#pragma endregion + +static char *POINTER_NAME_STATIC_BLOB_DEF = "vec0-static_blob_def"; +struct static_blob_definition { + void *p; + size_t dimensions; + size_t nvectors; + enum VectorElementType element_type; +}; +static void vec_static_blob_from_raw(sqlite3_context *context, int argc, + sqlite3_value **argv) { + + assert(argc == 4); + struct static_blob_definition *p; + p = sqlite3_malloc(sizeof(*p)); + if (!p) { + sqlite3_result_error_nomem(context); + return; + } + memset(p, 0, sizeof(*p)); + p->p = (void *)sqlite3_value_int64(argv[0]); + p->element_type = SQLITE_VEC_ELEMENT_TYPE_FLOAT32; + p->dimensions = sqlite3_value_int64(argv[2]); + p->nvectors = sqlite3_value_int64(argv[3]); + sqlite3_result_pointer(context, p, POINTER_NAME_STATIC_BLOB_DEF, + sqlite3_free); +} +#pragma region vec_static_blobs() table function + +#define MAX_STATIC_BLOBS 16 + +typedef struct static_blob static_blob; +struct static_blob { + char *name; + void *p; + size_t dimensions; + size_t nvectors; + enum VectorElementType element_type; +}; + +typedef struct vec_static_blob_data vec_static_blob_data; +struct vec_static_blob_data { + static_blob static_blobs[MAX_STATIC_BLOBS]; +}; + +typedef struct vec_static_blobs_vtab vec_static_blobs_vtab; +struct vec_static_blobs_vtab { + sqlite3_vtab base; + vec_static_blob_data *data; +}; + +typedef struct vec_static_blobs_cursor vec_static_blobs_cursor; +struct vec_static_blobs_cursor { + sqlite3_vtab_cursor base; + sqlite3_int64 iRowid; +}; + +static int vec_static_blobsConnect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, + sqlite3_vtab **ppVtab, char **pzErr) { + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(pzErr); + + vec_static_blobs_vtab *pNew; +#define VEC_STATIC_BLOBS_NAME 0 +#define VEC_STATIC_BLOBS_DATA 1 +#define VEC_STATIC_BLOBS_DIMENSIONS 2 +#define VEC_STATIC_BLOBS_COUNT 3 + int rc = sqlite3_declare_vtab( + db, "CREATE TABLE x(name, data, dimensions hidden, count hidden)"); + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); + *ppVtab = (sqlite3_vtab *)pNew; + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->data = pAux; + } + return rc; +} + +static int vec_static_blobsDisconnect(sqlite3_vtab *pVtab) { + vec_static_blobs_vtab *p = (vec_static_blobs_vtab *)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int vec_static_blobsUpdate(sqlite3_vtab *pVTab, int argc, + sqlite3_value **argv, sqlite_int64 *pRowid) { + UNUSED_PARAMETER(pRowid); + vec_static_blobs_vtab *p = (vec_static_blobs_vtab *)pVTab; + // DELETE operation + if (argc == 1 && sqlite3_value_type(argv[0]) != SQLITE_NULL) { + return SQLITE_ERROR; + } + // INSERT operation + else if (argc > 1 && sqlite3_value_type(argv[0]) == SQLITE_NULL) { + const char *key = + (const char *)sqlite3_value_text(argv[2 + VEC_STATIC_BLOBS_NAME]); + int idx = -1; + for (int i = 0; i < MAX_STATIC_BLOBS; i++) { + if (!p->data->static_blobs[i].name) { + p->data->static_blobs[i].name = sqlite3_mprintf("%s", key); + idx = i; + break; + } + } + if (idx < 0) + abort(); + struct static_blob_definition *def = sqlite3_value_pointer( + argv[2 + VEC_STATIC_BLOBS_DATA], POINTER_NAME_STATIC_BLOB_DEF); + p->data->static_blobs[idx].p = def->p; + p->data->static_blobs[idx].dimensions = def->dimensions; + p->data->static_blobs[idx].nvectors = def->nvectors; + p->data->static_blobs[idx].element_type = def->element_type; + + return SQLITE_OK; + } + // UPDATE operation + else if (argc > 1 && sqlite3_value_type(argv[0]) != SQLITE_NULL) { + return SQLITE_ERROR; + } + return SQLITE_ERROR; +} + +static int vec_static_blobsOpen(sqlite3_vtab *p, + sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec_static_blobs_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec_static_blobsClose(sqlite3_vtab_cursor *cur) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + sqlite3_free(pCur); + return SQLITE_OK; +} + +static int vec_static_blobsBestIndex(sqlite3_vtab *pVTab, + sqlite3_index_info *pIdxInfo) { + UNUSED_PARAMETER(pVTab); + pIdxInfo->idxNum = 1; + pIdxInfo->estimatedCost = (double)10; + pIdxInfo->estimatedRows = 10; + return SQLITE_OK; +} + +static int vec_static_blobsNext(sqlite3_vtab_cursor *cur); +static int vec_static_blobsFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, + const char *idxStr, int argc, + sqlite3_value **argv) { + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)pVtabCursor; + pCur->iRowid = -1; + vec_static_blobsNext(pVtabCursor); + return SQLITE_OK; +} + +static int vec_static_blobsRowid(sqlite3_vtab_cursor *cur, + sqlite_int64 *pRowid) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +static int vec_static_blobsNext(sqlite3_vtab_cursor *cur) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + vec_static_blobs_vtab *p = (vec_static_blobs_vtab *)pCur->base.pVtab; + pCur->iRowid++; + while (pCur->iRowid < MAX_STATIC_BLOBS) { + if (p->data->static_blobs[pCur->iRowid].name) { + return SQLITE_OK; + } + pCur->iRowid++; + } + return SQLITE_OK; +} + +static int vec_static_blobsEof(sqlite3_vtab_cursor *cur) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + return pCur->iRowid >= MAX_STATIC_BLOBS; +} + +static int vec_static_blobsColumn(sqlite3_vtab_cursor *cur, + sqlite3_context *context, int i) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + vec_static_blobs_vtab *p = (vec_static_blobs_vtab *)cur->pVtab; + switch (i) { + case VEC_STATIC_BLOBS_NAME: + sqlite3_result_text(context, p->data->static_blobs[pCur->iRowid].name, -1, + SQLITE_TRANSIENT); + break; + case VEC_STATIC_BLOBS_DATA: + sqlite3_result_null(context); + break; + case VEC_STATIC_BLOBS_DIMENSIONS: + sqlite3_result_int64(context, + p->data->static_blobs[pCur->iRowid].dimensions); + break; + case VEC_STATIC_BLOBS_COUNT: + sqlite3_result_int64(context, p->data->static_blobs[pCur->iRowid].nvectors); + break; + } + return SQLITE_OK; +} + +static sqlite3_module vec_static_blobsModule = { + /* iVersion */ 3, + /* xCreate */ 0, + /* xConnect */ vec_static_blobsConnect, + /* xBestIndex */ vec_static_blobsBestIndex, + /* xDisconnect */ vec_static_blobsDisconnect, + /* xDestroy */ 0, + /* xOpen */ vec_static_blobsOpen, + /* xClose */ vec_static_blobsClose, + /* xFilter */ vec_static_blobsFilter, + /* xNext */ vec_static_blobsNext, + /* xEof */ vec_static_blobsEof, + /* xColumn */ vec_static_blobsColumn, + /* xRowid */ vec_static_blobsRowid, + /* xUpdate */ vec_static_blobsUpdate, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0 +#endif +}; +#pragma endregion + +#pragma region vec_static_blob_entries() table function + +typedef struct vec_static_blob_entries_vtab vec_static_blob_entries_vtab; +struct vec_static_blob_entries_vtab { + sqlite3_vtab base; + static_blob *blob; +}; +typedef enum { + VEC_SBE__QUERYPLAN_FULLSCAN = 1, + VEC_SBE__QUERYPLAN_KNN = 2 +} vec_sbe_query_plan; + +struct sbe_query_knn_data { + i64 k; + i64 k_used; + // Array of rowids of size k. Must be freed with sqlite3_free(). + i32 *rowids; + // Array of distances of size k. Must be freed with sqlite3_free(). + f32 *distances; + i64 current_idx; +}; +void sbe_query_knn_data_clear(struct sbe_query_knn_data *knn_data) { + if (!knn_data) + return; + + if (knn_data->rowids) { + sqlite3_free(knn_data->rowids); + knn_data->rowids = NULL; + } + if (knn_data->distances) { + sqlite3_free(knn_data->distances); + knn_data->distances = NULL; + } +} + +typedef struct vec_static_blob_entries_cursor vec_static_blob_entries_cursor; +struct vec_static_blob_entries_cursor { + sqlite3_vtab_cursor base; + sqlite3_int64 iRowid; + vec_sbe_query_plan query_plan; + struct sbe_query_knn_data *knn_data; +}; + +static int vec_static_blob_entriesConnect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, + sqlite3_vtab **ppVtab, char **pzErr) { + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(pzErr); + vec_static_blob_data *blob_data = pAux; + int idx = -1; + for (int i = 0; i < MAX_STATIC_BLOBS; i++) { + if (!blob_data->static_blobs[i].name) + continue; + if (strncmp(blob_data->static_blobs[i].name, argv[3], + strlen(blob_data->static_blobs[i].name)) == 0) { + idx = i; + break; + } + } + if (idx < 0) + abort(); + vec_static_blob_entries_vtab *pNew; +#define VEC_STATIC_BLOB_ENTRIES_VECTOR 0 +#define VEC_STATIC_BLOB_ENTRIES_DISTANCE 1 +#define VEC_STATIC_BLOB_ENTRIES_K 2 + int rc = sqlite3_declare_vtab( + db, "CREATE TABLE x(vector, distance hidden, k hidden)"); + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); + *ppVtab = (sqlite3_vtab *)pNew; + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->blob = &blob_data->static_blobs[idx]; + } + return rc; +} + +static int vec_static_blob_entriesCreate(sqlite3 *db, void *pAux, int argc, + const char *const *argv, + sqlite3_vtab **ppVtab, char **pzErr) { + return vec_static_blob_entriesConnect(db, pAux, argc, argv, ppVtab, pzErr); +} + +static int vec_static_blob_entriesDisconnect(sqlite3_vtab *pVtab) { + vec_static_blob_entries_vtab *p = (vec_static_blob_entries_vtab *)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int vec_static_blob_entriesOpen(sqlite3_vtab *p, + sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec_static_blob_entries_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec_static_blob_entriesClose(sqlite3_vtab_cursor *cur) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + sqlite3_free(pCur->knn_data); + sqlite3_free(pCur); + return SQLITE_OK; +} + +static int vec_static_blob_entriesBestIndex(sqlite3_vtab *pVTab, + sqlite3_index_info *pIdxInfo) { + vec_static_blob_entries_vtab *p = (vec_static_blob_entries_vtab *)pVTab; + int iMatchTerm = -1; + int iLimitTerm = -1; + // int iRowidTerm = -1; // https://github.com/asg017/sqlite-vec/issues/47 + int iKTerm = -1; + + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + if (!pIdxInfo->aConstraint[i].usable) + continue; + + int iColumn = pIdxInfo->aConstraint[i].iColumn; + int op = pIdxInfo->aConstraint[i].op; + if (op == SQLITE_INDEX_CONSTRAINT_MATCH && + iColumn == VEC_STATIC_BLOB_ENTRIES_VECTOR) { + if (iMatchTerm > -1) { + // https://github.com/asg017/sqlite-vec/issues/51 + return SQLITE_ERROR; + } + iMatchTerm = i; + } + if (op == SQLITE_INDEX_CONSTRAINT_LIMIT) { + iLimitTerm = i; + } + if (op == SQLITE_INDEX_CONSTRAINT_EQ && + iColumn == VEC_STATIC_BLOB_ENTRIES_K) { + iKTerm = i; + } + } + if (iMatchTerm >= 0) { + if (iLimitTerm < 0 && iKTerm < 0) { + // https://github.com/asg017/sqlite-vec/issues/51 + return SQLITE_ERROR; + } + if (iLimitTerm >= 0 && iKTerm >= 0) { + return SQLITE_ERROR; // limit or k, not both + } + if (pIdxInfo->nOrderBy < 1) { + vtab_set_error(pVTab, "ORDER BY distance required"); + return SQLITE_CONSTRAINT; + } + if (pIdxInfo->nOrderBy > 1) { + // https://github.com/asg017/sqlite-vec/issues/51 + vtab_set_error(pVTab, "more than 1 ORDER BY clause provided"); + return SQLITE_CONSTRAINT; + } + if (pIdxInfo->aOrderBy[0].iColumn != VEC_STATIC_BLOB_ENTRIES_DISTANCE) { + vtab_set_error(pVTab, "ORDER BY must be on the distance column"); + return SQLITE_CONSTRAINT; + } + if (pIdxInfo->aOrderBy[0].desc) { + vtab_set_error(pVTab, + "Only ascending in ORDER BY distance clause is supported, " + "DESC is not supported yet."); + return SQLITE_CONSTRAINT; + } + + pIdxInfo->idxNum = VEC_SBE__QUERYPLAN_KNN; + pIdxInfo->estimatedCost = (double)10; + pIdxInfo->estimatedRows = 10; + + pIdxInfo->orderByConsumed = 1; + pIdxInfo->aConstraintUsage[iMatchTerm].argvIndex = 1; + pIdxInfo->aConstraintUsage[iMatchTerm].omit = 1; + if (iLimitTerm >= 0) { + pIdxInfo->aConstraintUsage[iLimitTerm].argvIndex = 2; + pIdxInfo->aConstraintUsage[iLimitTerm].omit = 1; + } else { + pIdxInfo->aConstraintUsage[iKTerm].argvIndex = 2; + pIdxInfo->aConstraintUsage[iKTerm].omit = 1; + } + + } else { + pIdxInfo->idxNum = VEC_SBE__QUERYPLAN_FULLSCAN; + pIdxInfo->estimatedCost = (double)p->blob->nvectors; + pIdxInfo->estimatedRows = p->blob->nvectors; + } + return SQLITE_OK; +} + +static int vec_static_blob_entriesFilter(sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv) { + UNUSED_PARAMETER(idxStr); + assert(argc >= 0 && argc <= 3); + vec_static_blob_entries_cursor *pCur = + (vec_static_blob_entries_cursor *)pVtabCursor; + vec_static_blob_entries_vtab *p = + (vec_static_blob_entries_vtab *)pCur->base.pVtab; + + if (idxNum == VEC_SBE__QUERYPLAN_KNN) { + assert(argc == 2); + pCur->query_plan = VEC_SBE__QUERYPLAN_KNN; + struct sbe_query_knn_data *knn_data; + knn_data = sqlite3_malloc(sizeof(*knn_data)); + if (!knn_data) { + return SQLITE_NOMEM; + } + memset(knn_data, 0, sizeof(*knn_data)); + + void *queryVector; + size_t dimensions; + enum VectorElementType elementType; + vector_cleanup cleanup; + char *err; + int rc = vector_from_value(argv[0], &queryVector, &dimensions, &elementType, + &cleanup, &err); + if (rc != SQLITE_OK) { + return SQLITE_ERROR; + } + if (elementType != p->blob->element_type) { + return SQLITE_ERROR; + } + if (dimensions != p->blob->dimensions) { + return SQLITE_ERROR; + } + + i64 k = min(sqlite3_value_int64(argv[1]), (i64)p->blob->nvectors); + if (k < 0) { + // HANDLE https://github.com/asg017/sqlite-vec/issues/55 + return SQLITE_ERROR; + } + if (k == 0) { + knn_data->k = 0; + pCur->knn_data = knn_data; + return SQLITE_OK; + } + + size_t bsize = (p->blob->nvectors + 7) & ~7; + + i32 *topk_rowids = sqlite3_malloc(k * sizeof(i32)); + if (!topk_rowids) { + // HANDLE https://github.com/asg017/sqlite-vec/issues/55 + return SQLITE_ERROR; + } + f32 *distances = sqlite3_malloc(bsize * sizeof(f32)); + if (!distances) { + // HANDLE https://github.com/asg017/sqlite-vec/issues/55 + return SQLITE_ERROR; + } + + for (size_t i = 0; i < p->blob->nvectors; i++) { + // https://github.com/asg017/sqlite-vec/issues/52 + float *v = ((float *)p->blob->p) + (i * p->blob->dimensions); + distances[i] = + distance_l2_sqr_float(v, (float *)queryVector, &p->blob->dimensions); + } + u8 *candidates = bitmap_new(bsize); + assert(candidates); + + u8 *taken = bitmap_new(bsize); + assert(taken); + + bitmap_fill(candidates, bsize); + for (size_t i = bsize; i >= p->blob->nvectors; i--) { + bitmap_set(candidates, i, 0); + } + i32 k_used = 0; + min_idx(distances, bsize, candidates, topk_rowids, k, taken, &k_used); + knn_data->current_idx = 0; + knn_data->distances = distances; + knn_data->k = k; + knn_data->rowids = topk_rowids; + + pCur->knn_data = knn_data; + } else { + pCur->query_plan = VEC_SBE__QUERYPLAN_FULLSCAN; + pCur->iRowid = 0; + } + + return SQLITE_OK; +} + +static int vec_static_blob_entriesRowid(sqlite3_vtab_cursor *cur, + sqlite_int64 *pRowid) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + switch (pCur->query_plan) { + case VEC_SBE__QUERYPLAN_FULLSCAN: { + *pRowid = pCur->iRowid; + return SQLITE_OK; + } + case VEC_SBE__QUERYPLAN_KNN: { + i32 rowid = ((i32 *)pCur->knn_data->rowids)[pCur->knn_data->current_idx]; + *pRowid = (sqlite3_int64)rowid; + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +static int vec_static_blob_entriesNext(sqlite3_vtab_cursor *cur) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + switch (pCur->query_plan) { + case VEC_SBE__QUERYPLAN_FULLSCAN: { + pCur->iRowid++; + return SQLITE_OK; + } + case VEC_SBE__QUERYPLAN_KNN: { + pCur->knn_data->current_idx++; + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +static int vec_static_blob_entriesEof(sqlite3_vtab_cursor *cur) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + vec_static_blob_entries_vtab *p = + (vec_static_blob_entries_vtab *)pCur->base.pVtab; + switch (pCur->query_plan) { + case VEC_SBE__QUERYPLAN_FULLSCAN: { + return (size_t)pCur->iRowid >= p->blob->nvectors; + } + case VEC_SBE__QUERYPLAN_KNN: { + return pCur->knn_data->current_idx >= pCur->knn_data->k; + } + } + return SQLITE_ERROR; +} + +static int vec_static_blob_entriesColumn(sqlite3_vtab_cursor *cur, + sqlite3_context *context, int i) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + vec_static_blob_entries_vtab *p = (vec_static_blob_entries_vtab *)cur->pVtab; + + switch (pCur->query_plan) { + case VEC_SBE__QUERYPLAN_FULLSCAN: { + switch (i) { + case VEC_STATIC_BLOB_ENTRIES_VECTOR: + + sqlite3_result_blob( + context, + ((unsigned char *)p->blob->p) + + (pCur->iRowid * p->blob->dimensions * sizeof(float)), + p->blob->dimensions * sizeof(float), SQLITE_TRANSIENT); + sqlite3_result_subtype(context, p->blob->element_type); + break; + } + return SQLITE_OK; + } + case VEC_SBE__QUERYPLAN_KNN: { + switch (i) { + case VEC_STATIC_BLOB_ENTRIES_VECTOR: { + i32 rowid = ((i32 *)pCur->knn_data->rowids)[pCur->knn_data->current_idx]; + sqlite3_result_blob(context, + ((unsigned char *)p->blob->p) + + (rowid * p->blob->dimensions * sizeof(float)), + p->blob->dimensions * sizeof(float), + SQLITE_TRANSIENT); + sqlite3_result_subtype(context, p->blob->element_type); + break; + } + } + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +static sqlite3_module vec_static_blob_entriesModule = { + /* iVersion */ 3, + /* xCreate */ + vec_static_blob_entriesCreate, // handle rm? + // https://github.com/asg017/sqlite-vec/issues/55 + /* xConnect */ vec_static_blob_entriesConnect, + /* xBestIndex */ vec_static_blob_entriesBestIndex, + /* xDisconnect */ vec_static_blob_entriesDisconnect, + /* xDestroy */ vec_static_blob_entriesDisconnect, + /* xOpen */ vec_static_blob_entriesOpen, + /* xClose */ vec_static_blob_entriesClose, + /* xFilter */ vec_static_blob_entriesFilter, + /* xNext */ vec_static_blob_entriesNext, + /* xEof */ vec_static_blob_entriesEof, + /* xColumn */ vec_static_blob_entriesColumn, + /* xRowid */ vec_static_blob_entriesRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0 +#endif +}; +#pragma endregion + +#ifdef SQLITE_VEC_ENABLE_AVX +#define SQLITE_VEC_DEBUG_BUILD_AVX "avx" +#else +#define SQLITE_VEC_DEBUG_BUILD_AVX "" +#endif +#ifdef SQLITE_VEC_ENABLE_NEON +#define SQLITE_VEC_DEBUG_BUILD_NEON "neon" +#else +#define SQLITE_VEC_DEBUG_BUILD_NEON "" +#endif + +#define SQLITE_VEC_DEBUG_BUILD \ + SQLITE_VEC_DEBUG_BUILD_AVX " " SQLITE_VEC_DEBUG_BUILD_NEON + +#define SQLITE_VEC_DEBUG_STRING \ + "Version: " SQLITE_VEC_VERSION "\n" \ + "Date: " SQLITE_VEC_DATE "\n" \ + "Commit: " SQLITE_VEC_SOURCE "\n" \ + "Build flags: " SQLITE_VEC_DEBUG_BUILD + +SQLITE_VEC_API int sqlite3_vec_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi) { +#ifndef SQLITE_CORE + SQLITE_EXTENSION_INIT2(pApi); +#endif + int rc = SQLITE_OK; + +#define DEFAULT_FLAGS (SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC) + + rc = sqlite3_create_function_v2(db, "vec_version", 0, DEFAULT_FLAGS, + SQLITE_VEC_VERSION, _static_text_func, NULL, + NULL, NULL); + if (rc != SQLITE_OK) { + return rc; + } + rc = sqlite3_create_function_v2(db, "vec_debug", 0, DEFAULT_FLAGS, + SQLITE_VEC_DEBUG_STRING, _static_text_func, + NULL, NULL, NULL); + if (rc != SQLITE_OK) { + return rc; + } + static struct { + const char *zFName; + void (*xFunc)(sqlite3_context *, int, sqlite3_value **); + int nArg; + int flags; + } aFunc[] = { + // clang-format off + //{"vec_version", _static_text_func, 0, DEFAULT_FLAGS, (void *) SQLITE_VEC_VERSION }, + //{"vec_debug", _static_text_func, 0, DEFAULT_FLAGS, (void *) SQLITE_VEC_DEBUG_STRING }, + {"vec_distance_l2", vec_distance_l2, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_distance_l1", vec_distance_l1, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_distance_hamming",vec_distance_hamming, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_distance_cosine", vec_distance_cosine, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_length", vec_length, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_type", vec_type, 1, DEFAULT_FLAGS, }, + {"vec_to_json", vec_to_json, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_add", vec_add, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_sub", vec_sub, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_slice", vec_slice, 3, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_normalize", vec_normalize, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_f32", vec_f32, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_bit", vec_bit, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_int8", vec_int8, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_quantize_int8", vec_quantize_int8, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_quantize_binary", vec_quantize_binary, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + // clang-format on + }; + + static struct { + char *name; + const sqlite3_module *module; + void *p; + void (*xDestroy)(void *); + } aMod[] = { + // clang-format off + {"vec0", &vec0Module, NULL, NULL}, + {"vec_each", &vec_eachModule, NULL, NULL}, + // clang-format on + }; + + for (unsigned long i = 0; i < countof(aFunc) && rc == SQLITE_OK; i++) { + rc = sqlite3_create_function_v2(db, aFunc[i].zFName, aFunc[i].nArg, + aFunc[i].flags, NULL, aFunc[i].xFunc, NULL, + NULL, NULL); + if (rc != SQLITE_OK) { + *pzErrMsg = sqlite3_mprintf("Error creating function %s: %s", + aFunc[i].zFName, sqlite3_errmsg(db)); + return rc; + } + } + + for (unsigned long i = 0; i < countof(aMod) && rc == SQLITE_OK; i++) { + rc = sqlite3_create_module_v2(db, aMod[i].name, aMod[i].module, NULL, NULL); + if (rc != SQLITE_OK) { + *pzErrMsg = sqlite3_mprintf("Error creating module %s: %s", aMod[i].name, + sqlite3_errmsg(db)); + return rc; + } + } + + return SQLITE_OK; +} + +#ifndef SQLITE_VEC_OMIT_FS +SQLITE_VEC_API int sqlite3_vec_numpy_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi) { + UNUSED_PARAMETER(pzErrMsg); +#ifndef SQLITE_CORE + SQLITE_EXTENSION_INIT2(pApi); +#endif + int rc = SQLITE_OK; + rc = sqlite3_create_function_v2(db, "vec_npy_file", 1, SQLITE_RESULT_SUBTYPE, + NULL, vec_npy_file, NULL, NULL, NULL); + if(rc != SQLITE_OK) { + return rc; + } + rc = sqlite3_create_module_v2(db, "vec_npy_each", &vec_npy_eachModule, NULL, NULL); + return rc; +} +#endif + +SQLITE_VEC_API int +sqlite3_vec_static_blobs_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi) { + UNUSED_PARAMETER(pzErrMsg); +#ifndef SQLITE_CORE + SQLITE_EXTENSION_INIT2(pApi); +#endif + + int rc = SQLITE_OK; + vec_static_blob_data *static_blob_data; + static_blob_data = sqlite3_malloc(sizeof(*static_blob_data)); + if (!static_blob_data) { + return SQLITE_NOMEM; + } + memset(static_blob_data, 0, sizeof(*static_blob_data)); + + rc = sqlite3_create_function_v2( + db, "vec_static_blob_from_raw", 4, + DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, NULL, + vec_static_blob_from_raw, NULL, NULL, NULL); + if (rc != SQLITE_OK) + return rc; + + rc = sqlite3_create_module_v2(db, "vec_static_blobs", &vec_static_blobsModule, + static_blob_data, sqlite3_free); + if (rc != SQLITE_OK) + return rc; + rc = sqlite3_create_module_v2(db, "vec_static_blob_entries", + &vec_static_blob_entriesModule, + static_blob_data, NULL); + if (rc != SQLITE_OK) + return rc; + return rc; +} diff --git a/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.h b/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.h new file mode 100644 index 00000000000..084035db693 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.h @@ -0,0 +1,41 @@ +#ifndef SQLITE_VEC_H +#define SQLITE_VEC_H + +#ifndef SQLITE_CORE +#include "sqlite3ext.h" +#else +#include "sqlite3.h" +#endif + +#ifdef SQLITE_VEC_STATIC + #define SQLITE_VEC_API +#else + #ifdef _WIN32 + #define SQLITE_VEC_API __declspec(dllexport) + #else + #define SQLITE_VEC_API + #endif +#endif + +#define SQLITE_VEC_VERSION "v0.1.7-alpha.2" +// TODO rm +#define SQLITE_VEC_DATE "2025-01-10T23:18:50Z+0000" +#define SQLITE_VEC_SOURCE "bdc336d1cf2a2222b6227784bd30c6631603279b" + + +#define SQLITE_VEC_VERSION_MAJOR 0 +#define SQLITE_VEC_VERSION_MINOR 1 +#define SQLITE_VEC_VERSION_PATCH 7 + +#ifdef __cplusplus +extern "C" { +#endif + +SQLITE_VEC_API int sqlite3_vec_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi); + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef SQLITE_VEC_H */ diff --git a/third_party/sqlite3/ext/sqlite-vec/vendor.sh b/third_party/sqlite3/ext/sqlite-vec/vendor.sh new file mode 100644 index 00000000000..98b5faf1e52 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/vendor.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# IMPORTANT: use `./mach vendor third_party/sqlite3/ext-sqlite-vec.yaml`, +# don't invoke this script directly. + +# Script to download header from sqlite-vec extension amalgamation. + +set -e + +# Retrieve latest version value. +echo "" +echo "Get extension version." +version=`cat VERSION.txt` +echo "Github version: $version"; + +# Retrieve files and update sources. + +echo "" +echo "Retrieving amalgamation..." +amalgamation_url=""https://github.com/asg017/sqlite-vec/releases/download/v$version/sqlite-vec-$version-amalgamation.zip"" +wget -t 3 --retry-connrefused -w 5 --random-wait $amalgamation_url -qO amalgamation.zip +echo "Unpacking source files..." +unzip -p "amalgamation.zip" "sqlite-vec.h" > "sqlite-vec.h" +rm -f "amalgamation.zip" + +echo "" +echo "Update complete, please commit and check in your changes." +echo "" diff --git a/third_party/sqlite3/readme.txt b/third_party/sqlite3/readme.txt new file mode 100644 index 00000000000..91b38b92ee8 --- /dev/null +++ b/third_party/sqlite3/readme.txt @@ -0,0 +1,11 @@ +To vendor a new version of SQLite: + + ./mach vendor third_party/sqlite3/moz.yaml + +To vendor new versions of SQLite extensions, check for moz.yaml +files in ext/ subfolders. For example, to vendor sqlite-vec: + + ./mach vendor third_party/sqlite3/ext/sqlite-vec/moz.yaml + +Vendoring tracks GitHub tags, specific tags can be targeted +using the --revision option. diff --git a/toolkit/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs b/toolkit/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs index 547427767db..34d755bafe8 100644 --- a/toolkit/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs +++ b/toolkit/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs @@ -75,7 +75,9 @@ export class UserCharacteristicsCanvasRenderingChild extends JSWindowActorChild }; } - return sha1(canvas.toDataURL("image/png", 1)).catch(stringifyError); + return sha1Uint8Array( + ctx.getImageData(0, 0, canvas.width, canvas.height).data + ).catch(stringifyError); }; const errors = []; @@ -360,9 +362,8 @@ ChromeUtils.defineLazyGetter(lazy, "recipes", () => { }; }); -async function sha1(message) { - const msgUint8 = new TextEncoder().encode(message); - const hashBuffer = await crypto.subtle.digest("SHA-1", msgUint8); +async function sha1Uint8Array(bytes) { + const hashBuffer = await crypto.subtle.digest("SHA-1", bytes); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, "0")).join(""); return hashHex; diff --git a/toolkit/components/antitracking/test/browser/browser.toml b/toolkit/components/antitracking/test/browser/browser.toml index 10d63f781bd..77888171d77 100644 --- a/toolkit/components/antitracking/test/browser/browser.toml +++ b/toolkit/components/antitracking/test/browser/browser.toml @@ -219,6 +219,9 @@ support-files = [ "!/browser/components/originattributes/test/browser/file_thirdPartyChild.worker.xhr.html", "!/browser/components/originattributes/test/browser/file_thirdPartyChild.xhr.html", ] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug", # Bug 1775745 +] ["browser_staticPartition_network.js"] diff --git a/toolkit/components/backgroundhangmonitor/tests/xpcshell.toml b/toolkit/components/backgroundhangmonitor/tests/xpcshell.toml index aa238969fd3..3b2b4500596 100644 --- a/toolkit/components/backgroundhangmonitor/tests/xpcshell.toml +++ b/toolkit/components/backgroundhangmonitor/tests/xpcshell.toml @@ -9,6 +9,7 @@ skip-if = [ "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1417723 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1417723 "os == 'mac' && os_version == '14.70' && processor == 'x86_64' && opt", # Bug 1417723 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1417723 "os == 'win' && msix", "release_or_beta", "win11_2009 && bits == 32", # Bug 1760134 diff --git a/toolkit/components/credentialmanagement/CredentialChooserService.sys.mjs b/toolkit/components/credentialmanagement/CredentialChooserService.sys.mjs index 38c64ff4f40..5109074b2b0 100644 --- a/toolkit/components/credentialmanagement/CredentialChooserService.sys.mjs +++ b/toolkit/components/credentialmanagement/CredentialChooserService.sys.mjs @@ -39,7 +39,9 @@ XPCOMUtils.defineLazyPreferenceGetter( */ async function setIconToFavicon(icon, origin) { try { - let iconData = await lazy.PlacesUtils.promiseFaviconData(origin); + let iconData = await lazy.PlacesUtils.favicons.getFaviconForPage( + lazy.PlacesUtils.toURI(origin) + ); icon.src = iconData.uri.spec; } catch { icon.src = "chrome://global/skin/icons/defaultFavicon.svg"; diff --git a/browser/components/doh/DoHConfig.sys.mjs b/toolkit/components/doh/DoHConfig.sys.mjs similarity index 94% rename from browser/components/doh/DoHConfig.sys.mjs rename to toolkit/components/doh/DoHConfig.sys.mjs index 4eb82546119..f0d8e631a2f 100644 --- a/browser/components/doh/DoHConfig.sys.mjs +++ b/toolkit/components/doh/DoHConfig.sys.mjs @@ -262,20 +262,22 @@ export const DoHConfigController = { observe(subject, topic, data) { switch (topic) { case kPrefChangedTopic: - let allowedPrefs = Object.getOwnPropertyNames(kConfigPrefs).map( - k => kConfigPrefs[k] - ); - if ( - !allowedPrefs.some(pref => - [ - `${regionPrefBranch()}.${pref}`, - `${kGlobalPrefBranch}.${pref}`, - ].includes(data) - ) - ) { - break; + { + let allowedPrefs = Object.getOwnPropertyNames(kConfigPrefs).map( + k => kConfigPrefs[k] + ); + if ( + !allowedPrefs.some(pref => + [ + `${regionPrefBranch()}.${pref}`, + `${kGlobalPrefBranch}.${pref}`, + ].includes(data) + ) + ) { + break; + } + this.notifyNewConfig(); } - this.notifyNewConfig(); break; case "idle-daily": if ( @@ -331,7 +333,11 @@ export const DoHConfigController = { return; } - if (localConfig.rolloutEnabled) { + let isAndroid = Services.appinfo.OS === "Android"; + if ( + (isAndroid && localConfig.androidRolloutEnabled) || + (!isAndroid && localConfig.rolloutEnabled) + ) { newConfig.enabled = true; } diff --git a/browser/components/doh/DoHController.sys.mjs b/toolkit/components/doh/DoHController.sys.mjs similarity index 99% rename from browser/components/doh/DoHController.sys.mjs rename to toolkit/components/doh/DoHController.sys.mjs index 2892ffd91e9..017de747c84 100644 --- a/browser/components/doh/DoHController.sys.mjs +++ b/toolkit/components/doh/DoHController.sys.mjs @@ -14,9 +14,9 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { AsyncShutdown: "resource://gre/modules/AsyncShutdown.sys.mjs", ClientID: "resource://gre/modules/ClientID.sys.mjs", - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs", - Heuristics: "resource:///modules/DoHHeuristics.sys.mjs", + Heuristics: "resource://gre/modules/DoHHeuristics.sys.mjs", NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", Preferences: "resource://gre/modules/Preferences.sys.mjs", clearTimeout: "resource://gre/modules/Timer.sys.mjs", @@ -589,7 +589,7 @@ export const DoHController = { // Importing the module here saves us from having to do it at startup, and // ensures tests have time to set prefs before the module initializes. let { TRRRacer } = ChromeUtils.importESModule( - "resource:///modules/TRRPerformance.sys.mjs" + "resource://gre/modules/TRRPerformance.sys.mjs" ); await new Promise(resolve => { let trrList = diff --git a/browser/components/doh/DoHHeuristics.sys.mjs b/toolkit/components/doh/DoHHeuristics.sys.mjs similarity index 98% rename from browser/components/doh/DoHHeuristics.sys.mjs rename to toolkit/components/doh/DoHHeuristics.sys.mjs index ecbc0f5b779..fd39a9be17c 100644 --- a/browser/components/doh/DoHHeuristics.sys.mjs +++ b/toolkit/components/doh/DoHHeuristics.sys.mjs @@ -26,7 +26,7 @@ XPCOMUtils.defineLazyServiceGetter( ); ChromeUtils.defineESModuleGetters(lazy, { - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", }); const GLOBAL_CANARY = "use-application-dns.net."; @@ -279,6 +279,10 @@ async function thirdPartyRoots() { } async function enterprisePolicy() { + if (!Services.policies) { + return "no_policy_set"; + } + if (Services.policies.status === Services.policies.ACTIVE) { let policies = Services.policies.getActivePolicies(); diff --git a/browser/components/doh/DoHTestUtils.sys.mjs b/toolkit/components/doh/DoHTestUtils.sys.mjs similarity index 100% rename from browser/components/doh/DoHTestUtils.sys.mjs rename to toolkit/components/doh/DoHTestUtils.sys.mjs diff --git a/browser/components/doh/TRRPerformance.sys.mjs b/toolkit/components/doh/TRRPerformance.sys.mjs similarity index 99% rename from browser/components/doh/TRRPerformance.sys.mjs rename to toolkit/components/doh/TRRPerformance.sys.mjs index 370a94471bd..ac18209606f 100644 --- a/browser/components/doh/TRRPerformance.sys.mjs +++ b/toolkit/components/doh/TRRPerformance.sys.mjs @@ -77,6 +77,9 @@ function getRandomSubdomain() { // callback. The wrapper attempts the lookup 3 times before passing on a failure. // If a false-y `domain` is supplied, a random subdomain will be used. Each retry // will use a different random subdomain to ensure we bypass chached responses. +/** + * + */ export class DNSLookup { constructor(domain, trrServer, callback) { this._domain = domain; @@ -120,6 +123,9 @@ DNSLookup.prototype.QueryInterface = ChromeUtils.generateQI(["nsIDNSListener"]); // A wrapper around a single set of measurements. The required lookups are // triggered and the results aggregated before telemetry is sent. If aborted, // any aggregated results are discarded. +/** + * + */ export class LookupAggregator { constructor(onCompleteCallback, trrList) { this.onCompleteCallback = onCompleteCallback; @@ -221,6 +227,9 @@ export class LookupAggregator { // When the network goes down, an ongoing aggregator is aborted and a new one // spawned next time we get a link, up to 5 times. On the fifth time, we just // let the aggegator complete and mark it as tainted. +/** + * + */ export class TRRRacer { constructor(onCompleteCallback, trrList) { this._aggregator = null; diff --git a/browser/components/doh/metrics.yaml b/toolkit/components/doh/metrics.yaml similarity index 100% rename from browser/components/doh/metrics.yaml rename to toolkit/components/doh/metrics.yaml diff --git a/browser/components/doh/moz.build b/toolkit/components/doh/moz.build similarity index 92% rename from browser/components/doh/moz.build rename to toolkit/components/doh/moz.build index 05030b09ab7..3dbc9ac2171 100644 --- a/browser/components/doh/moz.build +++ b/toolkit/components/doh/moz.build @@ -5,7 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. with Files("**"): - BUG_COMPONENT = ("Firefox", "Security") + BUG_COMPONENT = ("Core", "Networking: DNS") EXTRA_JS_MODULES += [ "DoHConfig.sys.mjs", diff --git a/browser/components/doh/test/browser/browser.toml b/toolkit/components/doh/test/browser/browser.toml similarity index 86% rename from browser/components/doh/test/browser/browser.toml rename to toolkit/components/doh/test/browser/browser.toml index a8df8bea0c7..5124955ef16 100644 --- a/browser/components/doh/test/browser/browser.toml +++ b/toolkit/components/doh/test/browser/browser.toml @@ -1,5 +1,6 @@ [DEFAULT] head = "head.js" +skip-if = ["os == 'android'"] # browser-chrome tests don't work on android ["browser_cleanFlow.js"] diff --git a/browser/components/doh/test/browser/browser_cleanFlow.js b/toolkit/components/doh/test/browser/browser_cleanFlow.js similarity index 100% rename from browser/components/doh/test/browser/browser_cleanFlow.js rename to toolkit/components/doh/test/browser/browser_cleanFlow.js diff --git a/browser/components/doh/test/browser/browser_dirtyEnable.js b/toolkit/components/doh/test/browser/browser_dirtyEnable.js similarity index 100% rename from browser/components/doh/test/browser/browser_dirtyEnable.js rename to toolkit/components/doh/test/browser/browser_dirtyEnable.js diff --git a/browser/components/doh/test/browser/browser_doh_region.js b/toolkit/components/doh/test/browser/browser_doh_region.js similarity index 100% rename from browser/components/doh/test/browser/browser_doh_region.js rename to toolkit/components/doh/test/browser/browser_doh_region.js diff --git a/browser/components/doh/test/browser/browser_doorhangerUserReject.js b/toolkit/components/doh/test/browser/browser_doorhangerUserReject.js similarity index 100% rename from browser/components/doh/test/browser/browser_doorhangerUserReject.js rename to toolkit/components/doh/test/browser/browser_doorhangerUserReject.js diff --git a/browser/components/doh/test/browser/browser_platformDetection.js b/toolkit/components/doh/test/browser/browser_platformDetection.js similarity index 98% rename from browser/components/doh/test/browser/browser_platformDetection.js rename to toolkit/components/doh/test/browser/browser_platformDetection.js index 025546ae9ec..4d7dd6f6432 100644 --- a/browser/components/doh/test/browser/browser_platformDetection.js +++ b/toolkit/components/doh/test/browser/browser_platformDetection.js @@ -5,7 +5,7 @@ "use strict"; ChromeUtils.defineESModuleGetters(this, { - Heuristics: "resource:///modules/DoHHeuristics.sys.mjs", + Heuristics: "resource://gre/modules/DoHHeuristics.sys.mjs", }); add_task(setup); diff --git a/browser/components/doh/test/browser/browser_policyOverride.js b/toolkit/components/doh/test/browser/browser_policyOverride.js similarity index 100% rename from browser/components/doh/test/browser/browser_policyOverride.js rename to toolkit/components/doh/test/browser/browser_policyOverride.js diff --git a/browser/components/doh/test/browser/browser_providerSteering.js b/toolkit/components/doh/test/browser/browser_providerSteering.js similarity index 100% rename from browser/components/doh/test/browser/browser_providerSteering.js rename to toolkit/components/doh/test/browser/browser_providerSteering.js diff --git a/browser/components/doh/test/browser/browser_remoteSettings_newProfile.js b/toolkit/components/doh/test/browser/browser_remoteSettings_newProfile.js similarity index 100% rename from browser/components/doh/test/browser/browser_remoteSettings_newProfile.js rename to toolkit/components/doh/test/browser/browser_remoteSettings_newProfile.js diff --git a/browser/components/doh/test/browser/browser_remoteSettings_rollout.js b/toolkit/components/doh/test/browser/browser_remoteSettings_rollout.js similarity index 100% rename from browser/components/doh/test/browser/browser_remoteSettings_rollout.js rename to toolkit/components/doh/test/browser/browser_remoteSettings_rollout.js diff --git a/browser/components/doh/test/browser/browser_rollback.js b/toolkit/components/doh/test/browser/browser_rollback.js similarity index 100% rename from browser/components/doh/test/browser/browser_rollback.js rename to toolkit/components/doh/test/browser/browser_rollback.js diff --git a/browser/components/doh/test/browser/browser_throttle_heuristics.js b/toolkit/components/doh/test/browser/browser_throttle_heuristics.js similarity index 100% rename from browser/components/doh/test/browser/browser_throttle_heuristics.js rename to toolkit/components/doh/test/browser/browser_throttle_heuristics.js diff --git a/browser/components/doh/test/browser/browser_trrSelect.js b/toolkit/components/doh/test/browser/browser_trrSelect.js similarity index 100% rename from browser/components/doh/test/browser/browser_trrSelect.js rename to toolkit/components/doh/test/browser/browser_trrSelect.js diff --git a/browser/components/doh/test/browser/browser_trrSelection_disable.js b/toolkit/components/doh/test/browser/browser_trrSelection_disable.js similarity index 100% rename from browser/components/doh/test/browser/browser_trrSelection_disable.js rename to toolkit/components/doh/test/browser/browser_trrSelection_disable.js diff --git a/browser/components/doh/test/browser/browser_userInterference.js b/toolkit/components/doh/test/browser/browser_userInterference.js similarity index 100% rename from browser/components/doh/test/browser/browser_userInterference.js rename to toolkit/components/doh/test/browser/browser_userInterference.js diff --git a/browser/components/doh/test/browser/head.js b/toolkit/components/doh/test/browser/head.js similarity index 98% rename from browser/components/doh/test/browser/head.js rename to toolkit/components/doh/test/browser/head.js index 236680d8d09..53c56d1750d 100644 --- a/browser/components/doh/test/browser/head.js +++ b/toolkit/components/doh/test/browser/head.js @@ -2,10 +2,10 @@ ChromeUtils.defineESModuleGetters(this, { ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs", - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", - DoHController: "resource:///modules/DoHController.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", + DoHController: "resource://gre/modules/DoHController.sys.mjs", DoHTestUtils: "resource://testing-common/DoHTestUtils.sys.mjs", - Heuristics: "resource:///modules/DoHHeuristics.sys.mjs", + Heuristics: "resource://gre/modules/DoHHeuristics.sys.mjs", Preferences: "resource://gre/modules/Preferences.sys.mjs", Region: "resource://gre/modules/Region.sys.mjs", RegionTestUtils: "resource://testing-common/RegionTestUtils.sys.mjs", diff --git a/browser/components/doh/test/unit/head.js b/toolkit/components/doh/test/unit/head.js similarity index 90% rename from browser/components/doh/test/unit/head.js rename to toolkit/components/doh/test/unit/head.js index 3c8010cba3c..c2f949b51b3 100644 --- a/browser/components/doh/test/unit/head.js +++ b/toolkit/components/doh/test/unit/head.js @@ -33,14 +33,13 @@ function addCertFromFile(certdb, filename, trustString) { certdb.addCertFromBase64(pem, trustString); } -function ensureNoTelemetry() { +async function ensureNoTelemetry() { let events = - Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent || []; - events = events.filter(e => e[1] == "security.doh.trrPerformance"); - Assert.ok(!events.length); + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + Assert.ok( + !events || + !events.filter(e => e.category == "security.doh.trr_performance").length + ); } function setup() { @@ -80,7 +79,7 @@ function setup() { ); let TRRPerformance = ChromeUtils.importESModule( - "resource:///modules/TRRPerformance.sys.mjs" + "resource://gre/modules/TRRPerformance.sys.mjs" ); DNSLookup = TRRPerformance.DNSLookup; diff --git a/browser/components/doh/test/unit/test_DNSLookup.js b/toolkit/components/doh/test/unit/test_DNSLookup.js similarity index 100% rename from browser/components/doh/test/unit/test_DNSLookup.js rename to toolkit/components/doh/test/unit/test_DNSLookup.js diff --git a/browser/components/doh/test/unit/test_LookupAggregator.js b/toolkit/components/doh/test/unit/test_LookupAggregator.js similarity index 88% rename from browser/components/doh/test/unit/test_LookupAggregator.js rename to toolkit/components/doh/test/unit/test_LookupAggregator.js index e63920ee351..269d4d19418 100644 --- a/browser/components/doh/test/unit/test_LookupAggregator.js +++ b/toolkit/components/doh/test/unit/test_LookupAggregator.js @@ -14,6 +14,7 @@ async function helper_SuccessfulLookupAggregator( networkUnstable = false, captivePortal = false ) { + Services.fog.testResetFOG(); let deferred = Promise.withResolvers(); let aggregator = new LookupAggregator(() => deferred.resolve(), trrList); // The aggregator's domain list should correctly reflect our set @@ -38,24 +39,23 @@ async function helper_SuccessfulLookupAggregator( Assert.equal(aggregator.captivePortal, captivePortal); Assert.equal(aggregator.results.length, aggregator.totalLookups); - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); Assert.ok(events); - events = events.filter(e => e[1] == "security.doh.trrPerformance"); + info(events); + + events = events.filter(e => e.category == "security.doh.trr_performance"); Assert.equal(events.length, aggregator.totalLookups); for (let event of events) { info(JSON.stringify(event)); - Assert.equal(event[1], "security.doh.trrPerformance"); - Assert.equal(event[2], "resolved"); - Assert.equal(event[3], "record"); - Assert.equal(event[4], "success"); + Assert.equal(event.category, "security.doh.trr_performance"); + Assert.equal(event.name, "resolved_record"); + Assert.equal(event.extra.value, "success"); } // We only need to check the payload of each event from here on. - events = events.map(e => e[5]); + events = events.map(e => e.extra); for (let trr of [trrServer1, trrServer2]) { // There should be two results for random subdomains. @@ -114,7 +114,7 @@ async function helper_SuccessfulLookupAggregator( } } - Services.telemetry.clearEvents(); + Services.fog.testResetFOG(); } add_task(async function test_SuccessfulLookupAggregator() { @@ -125,6 +125,7 @@ add_task(async function test_SuccessfulLookupAggregator() { }); add_task(async function test_AbortedLookupAggregator() { + Services.fog.testResetFOG(); let deferred = Promise.withResolvers(); let aggregator = new LookupAggregator(() => deferred.resolve(), trrList); // The aggregator's domain list should correctly reflect our set @@ -152,11 +153,7 @@ add_task(async function test_AbortedLookupAggregator() { Assert.ok(!aggregator.captivePortal); // Ensure we send no telemetry for an aborted run! - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; - Assert.ok( - !events || !events.filter(e => e[1] == "security.doh.trrPerformance").length - ); + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + Assert.ok(!events || !events.length); }); diff --git a/browser/components/doh/test/unit/test_TRRRacer.js b/toolkit/components/doh/test/unit/test_TRRRacer.js similarity index 87% rename from browser/components/doh/test/unit/test_TRRRacer.js rename to toolkit/components/doh/test/unit/test_TRRRacer.js index 9ad38f3981a..c43e284099c 100644 --- a/browser/components/doh/test/unit/test_TRRRacer.js +++ b/toolkit/components/doh/test/unit/test_TRRRacer.js @@ -7,6 +7,7 @@ add_task(setup); add_task(async function test_TRRRacer_cleanRun() { + Services.fog.testResetFOG(); let deferred = Promise.withResolvers(); let racer = new TRRRacer(() => { deferred.resolve(); @@ -17,15 +18,12 @@ add_task(async function test_TRRRacer_cleanRun() { await deferred.promise; Assert.equal(racer._retryCount, 1); - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; - Assert.ok(events); - events = events.filter(e => e[1] == "security.doh.trrPerformance"); + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + events = events.filter(e => e.category == "security.doh.trr_performance"); Assert.equal(events.length, racer._aggregator.totalLookups); - Services.telemetry.clearEvents(); + Services.fog.testResetFOG(); // Simulate network changes and ensure no re-runs since it's already complete. async function testNetworkChange(captivePortal = false) { @@ -44,7 +42,7 @@ add_task(async function test_TRRRacer_cleanRun() { } Assert.equal(racer._retryCount, 1); - ensureNoTelemetry(); + await ensureNoTelemetry(); if (captivePortal) { Services.obs.notifyObservers(null, "captive-portal-login-abort"); @@ -56,6 +54,7 @@ add_task(async function test_TRRRacer_cleanRun() { }); async function test_TRRRacer_networkFlux_helper(captivePortal = false) { + Services.fog.testResetFOG(); let deferred = Promise.withResolvers(); let racer = new TRRRacer(() => { deferred.resolve(); @@ -70,7 +69,7 @@ async function test_TRRRacer_networkFlux_helper(captivePortal = false) { } Assert.ok(racer._aggregator.aborted); - ensureNoTelemetry(); + await ensureNoTelemetry(); Assert.equal(racer._retryCount, 1); Assert.ok(!deferred.resolved); @@ -85,15 +84,12 @@ async function test_TRRRacer_networkFlux_helper(captivePortal = false) { Assert.equal(racer._retryCount, 2); - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; - Assert.ok(events); - events = events.filter(e => e[1] == "security.doh.trrPerformance"); + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + events = events.filter(e => e.category == "security.doh.trr_performance"); Assert.equal(events.length, racer._aggregator.totalLookups); - Services.telemetry.clearEvents(); + Services.fog.testResetFOG(); if (captivePortal) { Services.obs.notifyObservers(null, "captive-portal-login-abort"); } @@ -123,7 +119,7 @@ async function test_TRRRacer_maxRetries_helper(captivePortal = false) { info("notified observers"); Assert.ok(racer._aggregator.aborted); - ensureNoTelemetry(); + await ensureNoTelemetry(); Assert.equal(racer._retryCount, i); Assert.ok(!deferred.resolved); @@ -145,15 +141,12 @@ async function test_TRRRacer_maxRetries_helper(captivePortal = false) { await deferred.promise; Assert.equal(racer._retryCount, 5); - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; - Assert.ok(events); - events = events.filter(e => e[1] == "security.doh.trrPerformance"); + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + events = events.filter(e => e.category == "security.doh.trr_performance"); Assert.equal(events.length, racer._aggregator.totalLookups); - Services.telemetry.clearEvents(); + Services.fog.testResetFOG(); if (captivePortal) { Services.obs.notifyObservers(null, "captive-portal-login-abort"); } diff --git a/browser/components/doh/test/unit/test_heuristics.js b/toolkit/components/doh/test/unit/test_heuristics.js similarity index 97% rename from browser/components/doh/test/unit/test_heuristics.js rename to toolkit/components/doh/test/unit/test_heuristics.js index a6a6c9b6c9c..cc487b46272 100644 --- a/browser/components/doh/test/unit/test_heuristics.js +++ b/toolkit/components/doh/test/unit/test_heuristics.js @@ -35,7 +35,7 @@ add_task(setup); add_task(async function test_parentalControls() { let DoHHeuristics = ChromeUtils.importESModule( - "resource:///modules/DoHHeuristics.sys.mjs" + "resource://gre/modules/DoHHeuristics.sys.mjs" ); let parentalControls = DoHHeuristics.parentalControls; diff --git a/browser/components/doh/test/unit/xpcshell.toml b/toolkit/components/doh/test/unit/xpcshell.toml similarity index 100% rename from browser/components/doh/test/unit/xpcshell.toml rename to toolkit/components/doh/test/unit/xpcshell.toml diff --git a/toolkit/components/formautofill/FormAutofillChild.sys.mjs b/toolkit/components/formautofill/FormAutofillChild.sys.mjs index 062c0b0dae4..d17cdc759be 100644 --- a/toolkit/components/formautofill/FormAutofillChild.sys.mjs +++ b/toolkit/components/formautofill/FormAutofillChild.sys.mjs @@ -528,6 +528,7 @@ export class FormAutofillChild extends JSWindowActorChild { * - NODES_REMOVED: HTMLElement[] - nodes removed * - ELEMENT_VISIBLE: HTMLElement[] - elements that became visible * - ELEMENT_INVISIBLE: HTMLElement[] - elements that became invisible + * - SELECT_OPTIONS_CHANGED: HTMLSelectElement[] - select elements with modified options * A form-change event is single-reasoned for visibility changes and can be multi-reasoned for mutations. */ async onFormChange(form, changes) { @@ -619,14 +620,17 @@ export class FormAutofillChild extends JSWindowActorChild { const currentFields = lazy.FormAutofillHandler.collectFormFieldDetails(currentForm); + const changedSelectElements = + changes[lazy.FORM_CHANGE_REASON.SELECT_OPTIONS_CHANGED]; if ( currentFields.length == handler.fieldDetails.length && currentFields.every( (field, idx) => field.element === handler.fieldDetails[idx].element - ) + ) && + !changedSelectElements.length ) { - // The detected form fields remain unchanged, - // so we don't notify the parent and the subtree children + // All detected fields (including options from detected