shaka-player 3.3.2 → 3.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.csslintrc +11 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- package/.github/pull_request_template.md +6 -34
- package/.github/workflows/build-and-test.yaml +129 -0
- package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
- package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
- package/.github/workflows/demo-version-index.yaml +29 -0
- package/.github/workflows/nightly-demo.yaml +42 -0
- package/.github/workflows/release-please.yaml +147 -0
- package/.github/workflows/safari-homedir-launcher.sh +18 -0
- package/.github/workflows/selenium-lab-tests.yaml +92 -0
- package/AUTHORS +2 -0
- package/CHANGELOG.md +1718 -1675
- package/CONTRIBUTING.md +2 -2
- package/CONTRIBUTORS +2 -0
- package/README.md +7 -7
- package/app-engine/README.md +9 -0
- package/app-engine/demo-version-index/README.md +14 -0
- package/app-engine/demo-version-index/app.yaml +2 -0
- package/app-engine/demo-version-index/main.py +162 -0
- package/app-engine/demo-version-index/requirements.txt +6 -0
- package/app-engine/demo-version-index/templates/index.html +114 -0
- package/app-engine/shaka-player-demo/README.md +18 -0
- package/app-engine/shaka-player-demo/app.yaml +61 -0
- package/app-engine/shaka-player-demo/main.py +95 -0
- package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
- package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
- package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
- package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
- package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
- package/app-engine/shaka-player-demo/posters/standard.png +0 -0
- package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
- package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
- package/app-engine/shaka-player-demo/posters.py +110 -0
- package/app-engine/shaka-player-demo/requirements.txt +5 -0
- package/app-engine/shaka-player-demo/time.txt +1 -0
- package/build/README.md +3 -3
- package/build/checkversion.py +2 -2
- package/build/conformance.textproto +13 -0
- package/build/docker/Dockerfile +20 -0
- package/build/docker/docker-compose.yml +10 -0
- package/build/gendeps.py +18 -15
- package/build/shaka-lab.yaml +163 -0
- package/build/shakaBuildHelpers.py +4 -29
- package/build/test.py +94 -29
- package/build/types/core +0 -1
- package/build/types/polyfill +1 -0
- package/build/wrapper.template.js +2 -2
- package/demo/TengwarTelcontar.woff2 +0 -0
- package/demo/asset_card.js +1 -2
- package/demo/cast_receiver/index.html +1 -1
- package/demo/cast_receiver/receiver_app.css +14 -14
- package/demo/common/assets.js +2 -0
- package/demo/config.js +0 -1
- package/demo/custom.js +0 -1
- package/demo/customWarning.txt +2 -2
- package/demo/demo.less +29 -18
- package/demo/demo_uncompiled.js +1 -13
- package/demo/index.html +1 -1
- package/demo/main.js +3 -3
- package/dist/controls.css +3 -3
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +191 -194
- package/dist/demo.compiled.debug.map +4 -4
- package/dist/demo.compiled.js +191 -194
- package/dist/demo.compiled.map +4 -4
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +232 -226
- package/dist/locales.js +30 -30
- package/dist/receiver.compiled.debug.js +43 -45
- package/dist/receiver.compiled.debug.map +4 -4
- package/dist/receiver.compiled.js +43 -45
- package/dist/receiver.compiled.map +4 -4
- package/dist/shaka-player.compiled.d.ts +247 -236
- package/dist/shaka-player.compiled.debug.d.ts +247 -236
- package/dist/shaka-player.compiled.debug.externs.js +15 -3
- package/dist/shaka-player.compiled.debug.js +284 -290
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +15 -3
- package/dist/shaka-player.compiled.js +855 -859
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +291 -280
- package/dist/shaka-player.ui.debug.d.ts +291 -280
- package/dist/shaka-player.ui.debug.externs.js +15 -3
- package/dist/shaka-player.ui.debug.js +296 -302
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +15 -3
- package/dist/shaka-player.ui.js +1005 -1009
- package/dist/shaka-player.ui.map +4 -4
- package/docs/design/REDESIGN.md +33 -33
- package/docs/design/bg-fetch.md +2 -2
- package/docs/design/codec_preferences.md +1 -1
- package/docs/design/dash-audio-channels.md +3 -3
- package/docs/design/dash-manifests.md +1 -1
- package/docs/design/gap-jumping.md +3 -3
- package/docs/design/preload.md +2 -2
- package/docs/tutorials/faq.md +8 -8
- package/docs/tutorials/index.json +1 -0
- package/docs/tutorials/plugins.md +3 -3
- package/docs/tutorials/selenium-grid-config.md +122 -0
- package/docs/tutorials/welcome.md +10 -2
- package/externs/cmcd.js +1 -1
- package/karma.conf.js +141 -30
- package/lib/abr/simple_abr_manager.js +12 -6
- package/lib/cast/cast_proxy.js +3 -4
- package/lib/cea/cea608_data_channel.js +2 -2
- package/lib/cea/cea708_service.js +5 -4
- package/lib/cea/mp4_cea_parser.js +11 -5
- package/lib/cea/sei_processor.js +6 -3
- package/lib/dash/dash_parser.js +11 -14
- package/lib/dash/mpd_utils.js +4 -5
- package/lib/dash/segment_list.js +1 -2
- package/lib/dash/segment_template.js +3 -3
- package/lib/hls/hls_parser.js +34 -20
- package/lib/hls/manifest_text_parser.js +3 -3
- package/lib/media/adaptation_set.js +1 -2
- package/lib/media/content_workarounds.js +2 -2
- package/lib/media/drm_engine.js +3 -2
- package/lib/media/media_source_engine.js +10 -3
- package/lib/media/mp4_segment_index_parser.js +1 -4
- package/lib/media/playhead.js +2 -2
- package/lib/media/presentation_timeline.js +18 -8
- package/lib/media/streaming_engine.js +6 -6
- package/lib/media/time_ranges_utils.js +1 -3
- package/lib/media/video_wrapper.js +1 -1
- package/lib/net/networking_engine.js +1 -1
- package/lib/offline/indexeddb/storage_mechanism.js +4 -2
- package/lib/offline/storage.js +96 -95
- package/lib/player.js +190 -114
- package/lib/polyfill/all.js +2 -3
- package/lib/polyfill/encryption_scheme.js +1 -1
- package/lib/polyfill/media_capabilities.js +3 -3
- package/lib/polyfill/mediasource.js +1 -1
- package/lib/polyfill/symbol.js +46 -0
- package/lib/text/cue.js +1 -1
- package/lib/text/simple_text_displayer.js +2 -1
- package/lib/text/ttml_text_parser.js +8 -5
- package/lib/text/ui_text_displayer.js +1 -1
- package/lib/util/buffer_utils.js +1 -3
- package/lib/util/config_utils.js +25 -0
- package/lib/util/ebml_parser.js +3 -3
- package/lib/util/error.js +8 -1
- package/lib/util/iterables.js +0 -46
- package/lib/util/manifest_parser_utils.js +1 -1
- package/lib/util/mime_utils.js +48 -1
- package/lib/util/mp4_box_parsers.js +1 -4
- package/lib/util/mp4_parser.js +5 -7
- package/lib/util/periods.js +15 -15
- package/lib/util/platform.js +3 -3
- package/lib/util/player_configuration.js +9 -14
- package/lib/util/pssh.js +1 -4
- package/lib/util/stream_utils.js +8 -5
- package/lib/util/string_utils.js +3 -5
- package/lib/util/uint8array_utils.js +3 -5
- package/lib/util/xml_utils.js +15 -7
- package/package.json +61 -36
- package/roadmap.md +17 -17
- package/shaka-player.uncompiled.js +1 -0
- package/test/abr/simple_abr_manager_unit.js +3 -8
- package/test/ads/ad_manager_unit.js +0 -6
- package/test/cast/cast_proxy_unit.js +0 -8
- package/test/cast/cast_receiver_integration.js +1 -18
- package/test/cast/cast_receiver_unit.js +1 -9
- package/test/cast/cast_sender_unit.js +0 -6
- package/test/cast/cast_utils_unit.js +1 -13
- package/test/cea/cea608_memory_unit.js +0 -5
- package/test/cea/cea708_service_unit.js +0 -7
- package/test/cea/cea708_window_unit.js +0 -5
- package/test/cea/cea_decoder_unit.js +0 -6
- package/test/cea/dtvcc_packet_builder_unit.js +0 -3
- package/test/cea/dtvcc_packet_unit.js +0 -5
- package/test/cea/mp4_cea_parser_unit.js +0 -4
- package/test/dash/dash_parser_content_protection_unit.js +1 -10
- package/test/dash/dash_parser_live_unit.js +2 -15
- package/test/dash/dash_parser_manifest_unit.js +2 -40
- package/test/dash/dash_parser_segment_base_unit.js +1 -8
- package/test/dash/dash_parser_segment_list_unit.js +1 -7
- package/test/dash/dash_parser_segment_template_unit.js +0 -9
- package/test/dash/mpd_utils_unit.js +3 -11
- package/test/demo/demo_unit.js +0 -5
- package/test/deprecate/enforcer_unit.js +0 -4
- package/test/deprecate/version_unit.js +0 -2
- package/test/hls/hls_live_unit.js +28 -14
- package/test/hls/hls_parser_unit.js +2 -15
- package/test/hls/manifest_text_parser_unit.js +19 -10
- package/test/media/adaptation_set_criteria_unit.js +3 -7
- package/test/media/adaptation_set_unit.js +0 -2
- package/test/media/buffering_observer_unit.js +1 -4
- package/test/media/closed_caption_parser_unit.js +0 -3
- package/test/media/drm_engine_integration.js +2 -15
- package/test/media/drm_engine_unit.js +4 -24
- package/test/media/manifest_parser_unit.js +0 -4
- package/test/media/media_source_engine_integration.js +1 -7
- package/test/media/media_source_engine_unit.js +5 -18
- package/test/media/mp4_segment_index_parser_unit.js +0 -4
- package/test/media/play_rate_controller_unit.js +0 -4
- package/test/media/playhead_unit.js +8 -16
- package/test/media/presentation_timeline_unit.js +4 -7
- package/test/media/quality_observer_unit.js +0 -4
- package/test/media/region_observer_unit.js +1 -6
- package/test/media/region_timeline_unit.js +0 -3
- package/test/media/segment_index_unit.js +0 -6
- package/test/media/segment_reference_unit.js +0 -3
- package/test/media/stall_detector_unit.js +0 -5
- package/test/media/streaming_engine_integration.js +11 -36
- package/test/media/streaming_engine_unit.js +11 -35
- package/test/media/time_ranges_utils_unit.js +0 -2
- package/test/media/transmuxer_integration.js +0 -6
- package/test/media/webm_segment_index_parser_unit.js +0 -4
- package/test/net/data_uri_plugin_unit.js +0 -7
- package/test/net/http_plugin_unit.js +0 -9
- package/test/net/networking_engine_unit.js +0 -11
- package/test/offline/download_progress_estimator_unit.js +0 -2
- package/test/offline/indexeddb_storage_unit.js +1 -7
- package/test/offline/manifest_convert_unit.js +0 -8
- package/test/offline/offline_integration.js +1 -10
- package/test/offline/offline_manifest_parser_unit.js +0 -6
- package/test/offline/offline_scheme_unit.js +0 -8
- package/test/offline/offline_uri_unit.js +0 -2
- package/test/offline/storage_compatibility_unit.js +2 -15
- package/test/offline/storage_integration.js +1 -27
- package/test/player_external.js +9 -11
- package/test/player_integration.js +28 -38
- package/test/player_load_graph_integration.js +1 -6
- package/test/player_src_equals_external.js +3 -9
- package/test/player_src_equals_integration.js +81 -90
- package/test/player_unit.js +150 -38
- package/test/routing/walker_unit.js +0 -8
- package/test/test/assets/large_file.mpd +1 -1
- package/test/test/boot.js +84 -22
- package/test/test/externs/filters.js +4 -0
- package/test/test/externs/jasmine.js +2 -2
- package/test/test/externs/karma.js +4 -0
- package/test/test/namespace.js +10 -0
- package/test/test/util/canned_idb.js +0 -8
- package/test/test/util/cea_utils.js +0 -6
- package/test/test/util/dash_parser_util.js +0 -13
- package/test/test/util/fake_ad.js +0 -3
- package/test/test/util/fake_ad_manager.js +0 -9
- package/test/test/util/fake_demo_main.js +0 -5
- package/test/test/util/fake_drm_engine.js +0 -6
- package/test/test/util/fake_media_source_engine.js +0 -7
- package/test/test/util/fake_networking_engine.js +0 -5
- package/test/test/util/fake_text_displayer.js +0 -5
- package/test/test/util/indexeddb_utils.js +1 -10
- package/test/test/util/jasmine_fetch.js +0 -1
- package/test/test/util/loader.js +0 -18
- package/test/test/util/manifest_generator.js +9 -14
- package/test/test/util/manifest_parser_util.js +0 -6
- package/test/test/util/offline_utils.js +0 -5
- package/test/test/util/simple_fakes.js +40 -28
- package/test/test/util/stream_generator.js +0 -14
- package/test/test/util/streaming_engine_util.js +0 -15
- package/test/test/util/test_scheme.js +1 -19
- package/test/test/util/ttml_utils.js +0 -2
- package/test/test/util/ui_utils.js +0 -9
- package/test/test/util/util.js +5 -19
- package/test/test/util/waiter.js +84 -43
- package/test/text/cue_integration.js +0 -4
- package/test/text/lrc_text_parser_unit.js +0 -4
- package/test/text/mp4_ttml_parser_unit.js +0 -6
- package/test/text/mp4_vtt_parser_unit.js +1 -7
- package/test/text/sbv_text_parser_unit.js +0 -4
- package/test/text/simple_text_displayer_unit.js +1 -8
- package/test/text/srt_text_parser_unit.js +0 -4
- package/test/text/ssa_text_parser_unit.js +0 -5
- package/test/text/text_engine_unit.js +2 -7
- package/test/text/text_track_integration.js +0 -2
- package/test/text/ttml_text_parser_unit.js +2 -11
- package/test/text/ui_text_displayer_unit.js +44 -41
- package/test/text/vtt_text_parser_unit.js +0 -9
- package/test/text/web_vtt_generator_unit.js +0 -3
- package/test/ui/ad_ui_unit.js +0 -11
- package/test/ui/localization_unit.js +0 -3
- package/test/ui/text_displayer_layout_unit.js +1 -12
- package/test/ui/ui_customization_unit.js +0 -6
- package/test/ui/ui_integration.js +0 -16
- package/test/ui/ui_unit.js +1 -17
- package/test/util/abortable_operation_unit.js +4 -9
- package/test/util/array_utils_unit.js +0 -2
- package/test/util/buffer_utils_unit.js +0 -2
- package/test/util/cmcd_manager_unit.js +0 -3
- package/test/util/data_view_reader_unit.js +0 -4
- package/test/util/ebml_parser_unit.js +0 -4
- package/test/util/event_manager_unit.js +0 -3
- package/test/util/fake_event_target_unit.js +0 -5
- package/test/util/functional_unit.js +1 -1
- package/test/util/iterables_unit.js +0 -64
- package/test/util/language_utils_unit.js +0 -3
- package/test/util/manifest_parser_utils_unit.js +0 -2
- package/test/util/mime_utils_unit.js +54 -0
- package/test/util/mp4_box_parsers_unit.js +0 -5
- package/test/util/mp4_parser_unit.js +0 -4
- package/test/util/multi_map_unit.js +0 -3
- package/test/util/object_utils_unit.js +0 -2
- package/test/util/periods_unit.js +93 -7
- package/test/util/pssh_unit.js +0 -5
- package/test/util/state_history_unit.js +0 -2
- package/test/util/stream_utils_unit.js +3 -8
- package/test/util/string_utils_unit.js +0 -6
- package/test/util/text_parser_unit.js +0 -2
- package/test/util/xml_utils_unit.js +0 -4
- package/ui/less/ad_controls.less +6 -6
- package/ui/less/buttons.less +6 -6
- package/ui/less/containers.less +13 -15
- package/ui/less/overflow_menu.less +4 -4
- package/ui/less/range_elements.less +7 -2
- package/ui/less/tooltip.less +4 -4
- package/ui/locales/sjn-translations.yaml +257 -0
- package/ui/locales/sjn.json +42 -0
- package/ui/seek_bar.js +2 -1
- package/.github/workflows/build_and_test.yaml +0 -73
- package/.github/workflows/release.yaml +0 -53
- package/docs/tutorials/gsoc-ideas-list.md +0 -3
- package/externs/svgelement.js +0 -18
- package/externs/webcrypto.js +0 -18
- package/lib/util/mutex.js +0 -52
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
.overlay-parent();
|
|
40
40
|
|
|
41
41
|
/* Vertical margins to occupy the same space as the thumb. */
|
|
42
|
-
margin: (@thumb-size - @track-height)/2 6px;
|
|
42
|
+
margin: calc((@thumb-size - @track-height) / 2) 6px;
|
|
43
43
|
|
|
44
44
|
/* Smaller height to contain the background for the virtual track. */
|
|
45
45
|
height: @track-height;
|
|
@@ -57,6 +57,11 @@
|
|
|
57
57
|
/* The track should fill the range element. */
|
|
58
58
|
width: 100%;
|
|
59
59
|
|
|
60
|
+
/* Since range elements are special input elements, they must reflect user
|
|
61
|
+
* interaction, so when the user hovers over the range element, the cursor
|
|
62
|
+
* must be a pointer. */
|
|
63
|
+
cursor: pointer;
|
|
64
|
+
|
|
60
65
|
/* The track should be tall enough to contain the thumb without clipping it.
|
|
61
66
|
* It is very tricky to make the thumb show outside the track on IE 11, and
|
|
62
67
|
* it is incompatible with our background gradients. */
|
|
@@ -104,7 +109,7 @@
|
|
|
104
109
|
|
|
105
110
|
/* Position the top of the range element so that it is centered on the
|
|
106
111
|
* container. Note that the container is actually smaller than the thumb. */
|
|
107
|
-
top: (@track-height - @thumb-size) / 2;
|
|
112
|
+
top: calc((@track-height - @thumb-size) / 2);
|
|
108
113
|
|
|
109
114
|
/* Make sure clicking at the very top of the bar still takes effect and is not
|
|
110
115
|
* confused with clicking the video to play/pause it. */
|
package/ui/less/tooltip.less
CHANGED
|
@@ -48,22 +48,22 @@
|
|
|
48
48
|
|
|
49
49
|
/* Override .material-icons-round text styling */
|
|
50
50
|
font-family: Roboto-Regular, Roboto, sans-serif;
|
|
51
|
-
line-height: @material-icons-width / 2;
|
|
51
|
+
line-height: calc(@material-icons-width / 2);
|
|
52
52
|
white-space: nowrap;
|
|
53
53
|
font-size: 13px;
|
|
54
54
|
|
|
55
55
|
/* Styling */
|
|
56
|
-
background: rgba(35
|
|
56
|
+
background: rgba(35 35 35 / 90%);
|
|
57
57
|
color: white;
|
|
58
58
|
border-radius: 3px;
|
|
59
59
|
padding: 5px 10px;
|
|
60
60
|
|
|
61
61
|
/* Positioning */
|
|
62
62
|
position: absolute;
|
|
63
|
-
bottom: @material-icons-width + 5px;
|
|
63
|
+
bottom: calc(@material-icons-width + 5px);
|
|
64
64
|
|
|
65
65
|
/* Left attribute is set to half of the width of the parent button */
|
|
66
|
-
left: @material-icons-width / 2;
|
|
66
|
+
left: calc(@material-icons-width / 2);
|
|
67
67
|
|
|
68
68
|
/* The tooltip is also translated 50% to appear centered */
|
|
69
69
|
.translateX(-0.5);
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Shaka Player Sindarin (Elvish) Translations
|
|
2
|
+
# Copyright 2022 Google LLC
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
# This documents the manual translation of our UI into Sindarin.
|
|
6
|
+
# This file is not consumed automatically.
|
|
7
|
+
|
|
8
|
+
# References:
|
|
9
|
+
# - Font: http://freetengwar.sourceforge.net/tengtelc.html
|
|
10
|
+
# - Transliteration & dictionary: https://www.tecendil.com/?mode=sindarin
|
|
11
|
+
# - Dictionary: https://www.jrrvf.com/hisweloke/sindar/
|
|
12
|
+
# - Dictionary: https://www.elfdict.com/w/run/s?include_old=1
|
|
13
|
+
# - Grammar: https://www.elvish.org/gwaith/sindarin_intro.htm
|
|
14
|
+
# - Grammar: https://eldamo.org/content/grammar-indexes/grammars-s.html
|
|
15
|
+
# - Imperative ending: -o
|
|
16
|
+
# - Thesaurus: https://www.thesaurus.com/
|
|
17
|
+
|
|
18
|
+
translations:
|
|
19
|
+
- key: AD_DURATION
|
|
20
|
+
english: "Ad duration"
|
|
21
|
+
sjn-literal: "time for break for money"
|
|
22
|
+
sjn-roman: "lû an hastië an mirian"
|
|
23
|
+
sjn: " "
|
|
24
|
+
|
|
25
|
+
- key: AD_PROGRESS
|
|
26
|
+
english: "Ad [AD_ON] of [NUM_ADS]"
|
|
27
|
+
sjn-literal: "break for money [A] / [B]"
|
|
28
|
+
sjn-roman: "hastië an mirian [A] / [B]"
|
|
29
|
+
sjn: " [AD_ON] / [NUM_ADS]"
|
|
30
|
+
|
|
31
|
+
- key: AD_TIME
|
|
32
|
+
english: "Ad: [AD_TIME]"
|
|
33
|
+
sjn-literal: "break for money: [A]"
|
|
34
|
+
sjn-roman: "hastië an mirian: [A]"
|
|
35
|
+
sjn: " : [AD_TIME]"
|
|
36
|
+
|
|
37
|
+
- key: AIRPLAY
|
|
38
|
+
english: "AirPlay"
|
|
39
|
+
sjn-literal: "heavens-make-play"
|
|
40
|
+
sjn-roman: "menelnortho"
|
|
41
|
+
sjn: ""
|
|
42
|
+
|
|
43
|
+
- key: AUTO_QUALITY
|
|
44
|
+
english: "Auto"
|
|
45
|
+
sjn-literal: "adapt/make fit"
|
|
46
|
+
sjn-roman: "cammo"
|
|
47
|
+
sjn: ""
|
|
48
|
+
|
|
49
|
+
- key: BACK
|
|
50
|
+
english: "Back"
|
|
51
|
+
sjn-literal: "return"
|
|
52
|
+
sjn-roman: "dan"
|
|
53
|
+
sjn: ""
|
|
54
|
+
|
|
55
|
+
- key: CAPTIONS
|
|
56
|
+
english: "Captions"
|
|
57
|
+
sjn-literal: "words written"
|
|
58
|
+
sjn-roman: "pith teithiel"
|
|
59
|
+
sjn: " "
|
|
60
|
+
|
|
61
|
+
- key: CAST
|
|
62
|
+
english: "Cast..."
|
|
63
|
+
sjn-literal: "throw"
|
|
64
|
+
sjn-roman: "hanto"
|
|
65
|
+
sjn: ""
|
|
66
|
+
|
|
67
|
+
- key: ENTER_LOOP_MODE
|
|
68
|
+
english: "Loop the current video"
|
|
69
|
+
sjn-literal: "enter repeating"
|
|
70
|
+
sjn-roman: "minno enquetië"
|
|
71
|
+
sjn: " "
|
|
72
|
+
|
|
73
|
+
- key: ENTER_PICTURE_IN_PICTURE
|
|
74
|
+
english: "Enter Picture-in-Picture"
|
|
75
|
+
sjn-literal: "enter mind-picture within mind-picture"
|
|
76
|
+
sjn-roman: "minno fanwos bir fanwos"
|
|
77
|
+
sjn: " "
|
|
78
|
+
|
|
79
|
+
- key: EXIT_FULL_SCREEN
|
|
80
|
+
english: "Exit full screen"
|
|
81
|
+
sjn-literal: "escape mind-picture full"
|
|
82
|
+
sjn-roman: "uthro fanwos panta"
|
|
83
|
+
sjn: " "
|
|
84
|
+
|
|
85
|
+
- key: EXIT_LOOP_MODE
|
|
86
|
+
english: "Stop looping the current video"
|
|
87
|
+
sjn-literal: "escape repeating"
|
|
88
|
+
sjn-roman: "uthro enquetië"
|
|
89
|
+
sjn: " "
|
|
90
|
+
|
|
91
|
+
- key: EXIT_PICTURE_IN_PICTURE
|
|
92
|
+
english: "Exit Picture-in-Picture"
|
|
93
|
+
sjn-literal: "escape mind-picture within mind-picture"
|
|
94
|
+
sjn-roman: "uthro fanwos bir fanwos"
|
|
95
|
+
sjn: " "
|
|
96
|
+
|
|
97
|
+
- key: FAST_FORWARD
|
|
98
|
+
english: "Fast-forward"
|
|
99
|
+
sjn-literal: "make-run fast"
|
|
100
|
+
sjn-roman: "northo lim"
|
|
101
|
+
sjn: " "
|
|
102
|
+
|
|
103
|
+
- key: FULL_SCREEN
|
|
104
|
+
english: "Full screen"
|
|
105
|
+
sjn-literal: "mind-picture full"
|
|
106
|
+
sjn-roman: "fanwos panta"
|
|
107
|
+
sjn: " "
|
|
108
|
+
|
|
109
|
+
- key: LANGUAGE
|
|
110
|
+
english: "Language"
|
|
111
|
+
sjn-literal: "language"
|
|
112
|
+
sjn-roman: "lambë"
|
|
113
|
+
sjn: ""
|
|
114
|
+
|
|
115
|
+
- key: LIVE
|
|
116
|
+
english: "Live"
|
|
117
|
+
sjn-literal: "freshest"
|
|
118
|
+
sjn-roman: "cîrwain"
|
|
119
|
+
sjn: ""
|
|
120
|
+
|
|
121
|
+
- key: LOOP
|
|
122
|
+
english: "Loop"
|
|
123
|
+
sjn-literal: "repeat"
|
|
124
|
+
sjn-roman: "enqueto"
|
|
125
|
+
sjn: ""
|
|
126
|
+
|
|
127
|
+
- key: MORE_SETTINGS
|
|
128
|
+
english: "More settings"
|
|
129
|
+
sjn-literal: "more+choices"
|
|
130
|
+
sjn-roman: "galainc"
|
|
131
|
+
sjn: ""
|
|
132
|
+
|
|
133
|
+
- key: MULTIPLE_LANGUAGES
|
|
134
|
+
english: "Multiple languages"
|
|
135
|
+
sjn-literal: "language without count"
|
|
136
|
+
sjn-roman: "lambë arnoediad"
|
|
137
|
+
sjn: " "
|
|
138
|
+
|
|
139
|
+
- key: MUTE
|
|
140
|
+
english: "Mute"
|
|
141
|
+
sjn-literal: "silence"
|
|
142
|
+
sjn-roman: "dîn"
|
|
143
|
+
sjn: ""
|
|
144
|
+
|
|
145
|
+
- key: NOT_APPLICABLE
|
|
146
|
+
english: "Not applicable"
|
|
147
|
+
sjn-literal: "not important"
|
|
148
|
+
sjn-roman: "la bâl"
|
|
149
|
+
sjn: " "
|
|
150
|
+
|
|
151
|
+
- key: OFF
|
|
152
|
+
english: "Off"
|
|
153
|
+
sjn-literal: "nothing"
|
|
154
|
+
sjn-roman: "unt"
|
|
155
|
+
sjn: ""
|
|
156
|
+
|
|
157
|
+
- key: ON
|
|
158
|
+
english: "On"
|
|
159
|
+
sjn-literal: "active"
|
|
160
|
+
sjn-roman: "carweg"
|
|
161
|
+
sjn: ""
|
|
162
|
+
|
|
163
|
+
- key: PAUSE
|
|
164
|
+
english: "Pause"
|
|
165
|
+
sjn-literal: "tarry/wait/pause"
|
|
166
|
+
sjn-roman: "hasto"
|
|
167
|
+
sjn: ""
|
|
168
|
+
|
|
169
|
+
- key: PICTURE_IN_PICTURE
|
|
170
|
+
english: "Picture-in-picture"
|
|
171
|
+
sjn-literal: "mind-picture within mind-picture"
|
|
172
|
+
sjn-roman: "fanwos bir fanwos"
|
|
173
|
+
sjn: " "
|
|
174
|
+
|
|
175
|
+
- key: PLAY
|
|
176
|
+
english: "Play"
|
|
177
|
+
sjn-literal: "make-run"
|
|
178
|
+
sjn-roman: "northo"
|
|
179
|
+
sjn: ""
|
|
180
|
+
|
|
181
|
+
- key: PLAYBACK_RATE
|
|
182
|
+
english: "Playback speed"
|
|
183
|
+
sjn-literal: "speed"
|
|
184
|
+
sjn-roman: "lintië"
|
|
185
|
+
sjn: ""
|
|
186
|
+
|
|
187
|
+
- key: REPLAY
|
|
188
|
+
english: "Replay"
|
|
189
|
+
sjn-literal: "make-run again"
|
|
190
|
+
sjn-roman: "adnortho"
|
|
191
|
+
sjn: ""
|
|
192
|
+
|
|
193
|
+
- key: RESOLUTION
|
|
194
|
+
english: "Resolution"
|
|
195
|
+
sjn-literal: "value/preciousness"
|
|
196
|
+
sjn-roman: "meiras"
|
|
197
|
+
sjn: ""
|
|
198
|
+
|
|
199
|
+
- key: REWIND
|
|
200
|
+
english: "Rewind"
|
|
201
|
+
sjn-literal: "make-run backwards"
|
|
202
|
+
sjn-roman: "northo abont"
|
|
203
|
+
sjn: " "
|
|
204
|
+
|
|
205
|
+
- key: SEEK
|
|
206
|
+
english: "Seek"
|
|
207
|
+
sjn-literal: "time"
|
|
208
|
+
sjn-roman: "lû"
|
|
209
|
+
sjn: ""
|
|
210
|
+
|
|
211
|
+
- key: SKIP_AD
|
|
212
|
+
english: "Skip Ad"
|
|
213
|
+
sjn-literal: "leap across break for money"
|
|
214
|
+
sjn-roman: "cabo thar hastië an mirian"
|
|
215
|
+
sjn: " "
|
|
216
|
+
|
|
217
|
+
- key: SKIP_TO_LIVE
|
|
218
|
+
english: "Skip ahead to live"
|
|
219
|
+
sjn-literal: "leap to freshest"
|
|
220
|
+
sjn-roman: "cabo na cîrwain"
|
|
221
|
+
sjn: " "
|
|
222
|
+
|
|
223
|
+
- key: STATISTICS
|
|
224
|
+
english: "Statistics"
|
|
225
|
+
sjn-literal: "interrogate numbers"
|
|
226
|
+
sjn-roman: "cetho neth"
|
|
227
|
+
sjn: " "
|
|
228
|
+
|
|
229
|
+
- key: SUBTITLE_FORCED
|
|
230
|
+
english: "Forced"
|
|
231
|
+
sjn-literal: "words written firm/abiding"
|
|
232
|
+
sjn-roman: "pith teithiel taug"
|
|
233
|
+
sjn: " "
|
|
234
|
+
|
|
235
|
+
- key: UNDETERMINED_LANGUAGE
|
|
236
|
+
english: "Undetermined"
|
|
237
|
+
sjn-literal: "not known"
|
|
238
|
+
sjn-roman: "la sinnen"
|
|
239
|
+
sjn: " "
|
|
240
|
+
|
|
241
|
+
- key: UNMUTE
|
|
242
|
+
english: "Unmute"
|
|
243
|
+
sjn-literal: "noise/sound"
|
|
244
|
+
sjn-roman: "lhôn"
|
|
245
|
+
sjn: ""
|
|
246
|
+
|
|
247
|
+
- key: UNRECOGNIZED_LANGUAGE
|
|
248
|
+
english: "Unrecognized"
|
|
249
|
+
sjn-literal: "not known"
|
|
250
|
+
sjn-roman: "la sinnen"
|
|
251
|
+
sjn: " "
|
|
252
|
+
|
|
253
|
+
- key: VOLUME
|
|
254
|
+
english: "Volume"
|
|
255
|
+
sjn-literal: "loud(ness)"
|
|
256
|
+
sjn-roman: "brui"
|
|
257
|
+
sjn: ""
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"AD_DURATION": " ",
|
|
3
|
+
"AD_PROGRESS": " [AD_ON] / [NUM_ADS]",
|
|
4
|
+
"AD_TIME": " : [AD_TIME]",
|
|
5
|
+
"AIRPLAY": "",
|
|
6
|
+
"AUTO_QUALITY": "",
|
|
7
|
+
"BACK": "",
|
|
8
|
+
"CAPTIONS": " ",
|
|
9
|
+
"CAST": "",
|
|
10
|
+
"ENTER_LOOP_MODE": " ",
|
|
11
|
+
"ENTER_PICTURE_IN_PICTURE": " ",
|
|
12
|
+
"EXIT_FULL_SCREEN": " ",
|
|
13
|
+
"EXIT_LOOP_MODE": " ",
|
|
14
|
+
"EXIT_PICTURE_IN_PICTURE": " ",
|
|
15
|
+
"FAST_FORWARD": " ",
|
|
16
|
+
"FULL_SCREEN": " ",
|
|
17
|
+
"LANGUAGE": "",
|
|
18
|
+
"LIVE": "",
|
|
19
|
+
"LOOP": "",
|
|
20
|
+
"MORE_SETTINGS": "",
|
|
21
|
+
"MULTIPLE_LANGUAGES": " ",
|
|
22
|
+
"MUTE": "",
|
|
23
|
+
"NOT_APPLICABLE": " ",
|
|
24
|
+
"OFF": "",
|
|
25
|
+
"ON": "",
|
|
26
|
+
"PAUSE": "",
|
|
27
|
+
"PICTURE_IN_PICTURE": " ",
|
|
28
|
+
"PLAY": "",
|
|
29
|
+
"PLAYBACK_RATE": "",
|
|
30
|
+
"REPLAY": "",
|
|
31
|
+
"RESOLUTION": "",
|
|
32
|
+
"REWIND": " ",
|
|
33
|
+
"SEEK": "",
|
|
34
|
+
"SKIP_AD": " ",
|
|
35
|
+
"SKIP_TO_LIVE": " ",
|
|
36
|
+
"STATISTICS": " ",
|
|
37
|
+
"SUBTITLE_FORCED": " ",
|
|
38
|
+
"UNDETERMINED_LANGUAGE": " ",
|
|
39
|
+
"UNMUTE": "",
|
|
40
|
+
"UNRECOGNIZED_LANGUAGE": " ",
|
|
41
|
+
"VOLUME": ""
|
|
42
|
+
}
|
package/ui/seek_bar.js
CHANGED
|
@@ -74,7 +74,8 @@ shaka.ui.SeekBar = class extends shaka.ui.RangeElement {
|
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
|
-
* When user is scrubbing the seek bar - we should pause the video - see
|
|
77
|
+
* When user is scrubbing the seek bar - we should pause the video - see
|
|
78
|
+
* https://github.com/google/shaka-player/pull/2898#issuecomment-705229215
|
|
78
79
|
* but will conditionally pause or play the video after scrubbing
|
|
79
80
|
* depending on its previous state
|
|
80
81
|
*
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
name: Build and Test PR
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request: # Trigger for pull requests.
|
|
5
|
-
types: [opened, synchronize, reopened, edited, ready_for_review]
|
|
6
|
-
branches:
|
|
7
|
-
- master
|
|
8
|
-
- v[0-9]*
|
|
9
|
-
workflow_dispatch: # Allows for manual triggering.
|
|
10
|
-
inputs:
|
|
11
|
-
ref:
|
|
12
|
-
description: "The ref to build and test."
|
|
13
|
-
required: False
|
|
14
|
-
|
|
15
|
-
jobs:
|
|
16
|
-
lint:
|
|
17
|
-
name: Lint
|
|
18
|
-
runs-on: ubuntu-latest
|
|
19
|
-
steps:
|
|
20
|
-
- name: Checkout code
|
|
21
|
-
uses: actions/checkout@v2
|
|
22
|
-
with:
|
|
23
|
-
ref: ${{ github.event.inputs.ref || github.ref }}
|
|
24
|
-
|
|
25
|
-
- name: Lint
|
|
26
|
-
run: python build/check.py
|
|
27
|
-
|
|
28
|
-
build_and_test:
|
|
29
|
-
# Don't waste time doing a full matrix of test runs when there was an
|
|
30
|
-
# obvious linter error.
|
|
31
|
-
needs: lint
|
|
32
|
-
strategy:
|
|
33
|
-
matrix:
|
|
34
|
-
os: ["ubuntu-latest", "macos-latest", "windows-latest"]
|
|
35
|
-
browser: ["Chrome", "Firefox", "Edge", "Safari"]
|
|
36
|
-
exclude:
|
|
37
|
-
- os: ubuntu-latest
|
|
38
|
-
browser: Edge
|
|
39
|
-
- os: windows-latest
|
|
40
|
-
browser: Safari
|
|
41
|
-
- os: ubuntu-latest
|
|
42
|
-
browser: Safari
|
|
43
|
-
include:
|
|
44
|
-
# Run Linux browsers with xvfb, so they're in a headless X session.
|
|
45
|
-
- os: ubuntu-latest
|
|
46
|
-
extra_flags: "--use-xvfb"
|
|
47
|
-
# Disable fail-fast so that one matrix-job failing doesn't make the other
|
|
48
|
-
# ones end early.
|
|
49
|
-
fail-fast: false
|
|
50
|
-
|
|
51
|
-
name: Build and test ${{ matrix.os }} ${{ matrix.browser }}
|
|
52
|
-
runs-on: ${{ matrix.os }}
|
|
53
|
-
|
|
54
|
-
steps:
|
|
55
|
-
# Firefox on Ubuntu appears to not have the right things installed in
|
|
56
|
-
# the environment used by GitHub actions, so make sure that ffmpeg is
|
|
57
|
-
# installed. Otherwise, the browser might not support some codecs that the
|
|
58
|
-
# tests assume will be supported.
|
|
59
|
-
- name: Install FFmpeg
|
|
60
|
-
if: matrix.os == 'ubuntu-latest' && matrix.browser == 'Firefox'
|
|
61
|
-
run: sudo apt -y update && sudo apt -y install ffmpeg
|
|
62
|
-
|
|
63
|
-
- name: Checkout code
|
|
64
|
-
uses: actions/checkout@v2
|
|
65
|
-
with:
|
|
66
|
-
ref: ${{ github.event.inputs.ref || github.ref }}
|
|
67
|
-
|
|
68
|
-
- name: Build Player
|
|
69
|
-
run: python build/all.py
|
|
70
|
-
|
|
71
|
-
- name: Test Player
|
|
72
|
-
run: |
|
|
73
|
-
python build/test.py --browsers ${{ matrix.browser }} --reporters spec --spec-hide-passed --drm ${{ matrix.extra_flags }}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
on:
|
|
2
|
-
push:
|
|
3
|
-
branches:
|
|
4
|
-
- master
|
|
5
|
-
- v[0-9]*
|
|
6
|
-
|
|
7
|
-
name: Release
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
release:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
outputs:
|
|
13
|
-
release_created: ${{ steps.release.outputs.release_created }}
|
|
14
|
-
tag_name: ${{ steps.release.outputs.tag_name }}
|
|
15
|
-
steps:
|
|
16
|
-
# Create/update release PR
|
|
17
|
-
- uses: google-github-actions/release-please-action@v3
|
|
18
|
-
id: release
|
|
19
|
-
with:
|
|
20
|
-
# Required input to specify the release type (node package).
|
|
21
|
-
release-type: node
|
|
22
|
-
# Make sure the player version gets updated.
|
|
23
|
-
extra-files: lib/player.js
|
|
24
|
-
# Make sure we create the PR against the correct branch.
|
|
25
|
-
default-branch: ${{ github.ref_name }}
|
|
26
|
-
|
|
27
|
-
# The jobs below are all conditional on a release having been created by
|
|
28
|
-
# someone merging the release PR. They all run in parallel.
|
|
29
|
-
|
|
30
|
-
npm:
|
|
31
|
-
runs-on: ubuntu-latest
|
|
32
|
-
needs: release
|
|
33
|
-
if: ${{ needs.release.outputs.release_created }}
|
|
34
|
-
steps:
|
|
35
|
-
- uses: actions/checkout@v2
|
|
36
|
-
- uses: actions/setup-node@v1
|
|
37
|
-
with:
|
|
38
|
-
node-version: 12
|
|
39
|
-
registry-url: 'https://registry.npmjs.org'
|
|
40
|
-
- run: npm ci
|
|
41
|
-
- run: npm publish
|
|
42
|
-
env:
|
|
43
|
-
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
|
|
44
|
-
- run: npm pack
|
|
45
|
-
- uses: svenstaro/upload-release-action@483c1e56f95e88835747b1c7c60581215016cbf2
|
|
46
|
-
with:
|
|
47
|
-
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
|
48
|
-
tag: ${{ needs.release.outputs.tag_name }}
|
|
49
|
-
file: shaka-player-*.tgz
|
|
50
|
-
file_glob: true
|
|
51
|
-
overwrite: true
|
|
52
|
-
|
|
53
|
-
# TODO: Publish to appspot
|
package/externs/svgelement.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/*! @license
|
|
2
|
-
* Shaka Player
|
|
3
|
-
* Copyright 2016 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @fileoverview Externs for SVGElement which are missing from the Closure
|
|
9
|
-
* compiler.
|
|
10
|
-
*
|
|
11
|
-
* @externs
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
// Right now, we only use SVGElement in an instanceof check, so we just declare
|
|
15
|
-
// the type with nothing on it.
|
|
16
|
-
|
|
17
|
-
/** @constructor */
|
|
18
|
-
function SVGElement() {}
|
package/externs/webcrypto.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/*! @license
|
|
2
|
-
* Shaka Player
|
|
3
|
-
* Copyright 2016 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @fileoverview Externs for crypto properties not in the Closure compiler.
|
|
10
|
-
*
|
|
11
|
-
* @externs
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @return {string}
|
|
17
|
-
*/
|
|
18
|
-
webCrypto.Crypto.prototype.randomUUID = function() {};
|
package/lib/util/mutex.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/*! @license
|
|
2
|
-
* Shaka Player
|
|
3
|
-
* Copyright 2016 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
goog.provide('shaka.util.Mutex');
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @summary A simple mutex.
|
|
12
|
-
*/
|
|
13
|
-
shaka.util.Mutex = class {
|
|
14
|
-
/** Creates the mutex. */
|
|
15
|
-
constructor() {
|
|
16
|
-
/** @private {!Array.<function()>} */
|
|
17
|
-
this.waiting_ = [];
|
|
18
|
-
|
|
19
|
-
/** @private {number} */
|
|
20
|
-
this.nextMutexId_ = 0;
|
|
21
|
-
|
|
22
|
-
/** @private {number} */
|
|
23
|
-
this.acquiredMutexId_ = 0;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** @return {!Promise.<number>} mutexId */
|
|
27
|
-
async acquire() {
|
|
28
|
-
const mutexId = ++this.nextMutexId_;
|
|
29
|
-
if (!this.acquiredMutexId_) {
|
|
30
|
-
this.acquiredMutexId_ = mutexId;
|
|
31
|
-
} else {
|
|
32
|
-
await (new Promise((resolve, reject) => {
|
|
33
|
-
this.waiting_.push(() => {
|
|
34
|
-
this.acquiredMutexId_ = mutexId;
|
|
35
|
-
resolve();
|
|
36
|
-
});
|
|
37
|
-
}));
|
|
38
|
-
}
|
|
39
|
-
return mutexId;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** @param {number} mutexId */
|
|
43
|
-
release(mutexId) {
|
|
44
|
-
if (mutexId == this.acquiredMutexId_) {
|
|
45
|
-
this.acquiredMutexId_ = 0;
|
|
46
|
-
if (this.waiting_.length > 0) {
|
|
47
|
-
const callback = this.waiting_.shift();
|
|
48
|
-
callback();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
};
|