@ -1,7 +1,7 @@
// ==UserScript==
// ==UserScript==
// @name Better xCloud
// @name Better xCloud
// @namespace https://github.com/redphx
// @namespace https://github.com/redphx
// @version 2.0.1
// @version 2.0.2
// @description Improve Xbox Cloud Gaming (xCloud) experience
// @description Improve Xbox Cloud Gaming (xCloud) experience
// @author redphx
// @author redphx
// @license MIT
// @license MIT
@ -13,7 +13,7 @@
// ==/UserScript==
// ==/UserScript==
'use strict' ;
'use strict' ;
const SCRIPT _VERSION = '2.0.1 ' ;
const SCRIPT _VERSION = '2.0.2 ' ;
const SCRIPT _HOME = 'https://github.com/redphx/better-xcloud' ;
const SCRIPT _HOME = 'https://github.com/redphx/better-xcloud' ;
const ENABLE _MKB = false ;
const ENABLE _MKB = false ;
@ -311,6 +311,7 @@ const Translations = {
"can-stream-xbox-360-games" : {
"can-stream-xbox-360-games" : {
"de-DE" : "Kann Xbox 360 Spiele streamen" ,
"de-DE" : "Kann Xbox 360 Spiele streamen" ,
"en-US" : "Can stream Xbox 360 games" ,
"en-US" : "Can stream Xbox 360 games" ,
"es-ES" : "Puede transmitir juegos de Xbox 360" ,
"it-IT" : "Puoi riprodurre i giochi Xbox 360" ,
"it-IT" : "Puoi riprodurre i giochi Xbox 360" ,
"ja-JP" : "Xbox 360ゲームのストリーミング可能" ,
"ja-JP" : "Xbox 360ゲームのストリーミング可能" ,
"pl-PL" : "Można strumieniować gry Xbox 360" ,
"pl-PL" : "Można strumieniować gry Xbox 360" ,
@ -321,6 +322,7 @@ const Translations = {
"cant-stream-xbox-360-games" : {
"cant-stream-xbox-360-games" : {
"de-DE" : "Kann Xbox 360 Spiele nicht streamen" ,
"de-DE" : "Kann Xbox 360 Spiele nicht streamen" ,
"en-US" : "Can't stream Xbox 360 games" ,
"en-US" : "Can't stream Xbox 360 games" ,
"es-ES" : "No puede transmitir juegos de Xbox 360" ,
"it-IT" : "Impossibile riprodurre i giochi Xbox 360" ,
"it-IT" : "Impossibile riprodurre i giochi Xbox 360" ,
"ja-JP" : "Xbox 360ゲームのストリーミング不可" ,
"ja-JP" : "Xbox 360ゲームのストリーミング不可" ,
"pl-PL" : "Nie można strumieniować gier Xbox 360" ,
"pl-PL" : "Nie można strumieniować gier Xbox 360" ,
@ -406,6 +408,7 @@ const Translations = {
"console-connect" : {
"console-connect" : {
"de-DE" : "Verbinden" ,
"de-DE" : "Verbinden" ,
"en-US" : "Connect" ,
"en-US" : "Connect" ,
"es-ES" : "Conectar" ,
"it-IT" : "Connetti" ,
"it-IT" : "Connetti" ,
"ja-JP" : "本体に接続" ,
"ja-JP" : "本体に接続" ,
"pl-PL" : "Połącz" ,
"pl-PL" : "Połącz" ,
@ -432,6 +435,7 @@ const Translations = {
"controller" : {
"controller" : {
"de-DE" : "Controller" ,
"de-DE" : "Controller" ,
"en-US" : "Controller" ,
"en-US" : "Controller" ,
"es-ES" : "Joystick" ,
"it-IT" : "Controller" ,
"it-IT" : "Controller" ,
"ja-JP" : "コントローラー" ,
"ja-JP" : "コントローラー" ,
"pl-PL" : "Kontroler" ,
"pl-PL" : "Kontroler" ,
@ -443,6 +447,7 @@ const Translations = {
"controller-polling-rate" : {
"controller-polling-rate" : {
"de-DE" : "Controller-Abfragerate" ,
"de-DE" : "Controller-Abfragerate" ,
"en-US" : "Controller polling rate" ,
"en-US" : "Controller polling rate" ,
"es-ES" : "Tasa de sondeo del Joystick" ,
"ja-JP" : "コントローラーポーリングレート" ,
"ja-JP" : "コントローラーポーリングレート" ,
"pl-PL" : "Częstotliwości raportowania kontrolera" ,
"pl-PL" : "Częstotliwości raportowania kontrolera" ,
"pt-BR" : "Taxa de consulta do controle" ,
"pt-BR" : "Taxa de consulta do controle" ,
@ -570,6 +575,7 @@ const Translations = {
"enable-controller-shortcuts" : {
"enable-controller-shortcuts" : {
"de-DE" : "Controller-Shortcuts aktivieren" ,
"de-DE" : "Controller-Shortcuts aktivieren" ,
"en-US" : "Enable controller shortcuts" ,
"en-US" : "Enable controller shortcuts" ,
"es-ES" : "Habilitar accesos directos del Joystick" ,
"it-IT" : "Consenti scorciatoie da controller" ,
"it-IT" : "Consenti scorciatoie da controller" ,
"ja-JP" : "コントローラーショートカットを有効化" ,
"ja-JP" : "コントローラーショートカットを有効化" ,
"pl-PL" : "Włącz skróty kontrolera" ,
"pl-PL" : "Włącz skróty kontrolera" ,
@ -596,8 +602,10 @@ const Translations = {
"enable-mkb" : {
"enable-mkb" : {
"de-DE" : "Maus- und Tastaturunterstützung aktivieren" ,
"de-DE" : "Maus- und Tastaturunterstützung aktivieren" ,
"en-US" : "Enable Mouse & Keyboard support" ,
"en-US" : "Enable Mouse & Keyboard support" ,
"es-ES" : "Habilitar soporte para ratón y teclado" ,
"ja-JP" : "マウス&キーボードのサポートを有効化" ,
"ja-JP" : "マウス&キーボードのサポートを有効化" ,
"pl-PL" : "Włącz obsługę myszy i klawiatury" ,
"pl-PL" : "Włącz obsługę myszy i klawiatury" ,
"pt-BR" : "Habilitar suporte ao Mouse & Teclado" ,
"tr-TR" : "Klavye ve fare desteğini aktive et" ,
"tr-TR" : "Klavye ve fare desteğini aktive et" ,
"vi-VN" : "Kích hoạt hỗ trợ Chuột & Bàn phím" ,
"vi-VN" : "Kích hoạt hỗ trợ Chuột & Bàn phím" ,
} ,
} ,
@ -619,8 +627,10 @@ const Translations = {
"enable-remote-play-feature" : {
"enable-remote-play-feature" : {
"de-DE" : "\"Remote Play\" Funktion aktivieren" ,
"de-DE" : "\"Remote Play\" Funktion aktivieren" ,
"en-US" : "Enable the \"Remote Play\" feature" ,
"en-US" : "Enable the \"Remote Play\" feature" ,
"es-ES" : "Activar la función \"Reproducción remota\"" ,
"ja-JP" : "リモートプレイ機能を有効化" ,
"ja-JP" : "リモートプレイ機能を有効化" ,
"pl-PL" : "Włącz funkcję \"Gra zdalna\"" ,
"pl-PL" : "Włącz funkcję \"Gra zdalna\"" ,
"pt-BR" : "Ativar o recurso \"Reprodução Remota\"" ,
"tr-TR" : "\"Uzaktan Oynama\" özelliğini aktive et" ,
"tr-TR" : "\"Uzaktan Oynama\" özelliğini aktive et" ,
"vi-VN" : "Bật tính năng \"Chơi từ xa\"" ,
"vi-VN" : "Bật tính năng \"Chơi từ xa\"" ,
} ,
} ,
@ -641,14 +651,17 @@ const Translations = {
"fast" : {
"fast" : {
"de-DE" : "Schnell" ,
"de-DE" : "Schnell" ,
"en-US" : "Fast" ,
"en-US" : "Fast" ,
"es-ES" : "Rápido" ,
"ja-JP" : "高速" ,
"ja-JP" : "高速" ,
"pl-PL" : "Szybko" ,
"pl-PL" : "Szybko" ,
"pt-BR" : "Rápido" ,
"tr-TR" : "Hı zlı " ,
"tr-TR" : "Hı zlı " ,
"vi-VN" : "Nhanh" ,
"vi-VN" : "Nhanh" ,
} ,
} ,
"getting-consoles-list" : {
"getting-consoles-list" : {
"de-DE" : "Rufe Liste der Konsolen ab..." ,
"de-DE" : "Rufe Liste der Konsolen ab..." ,
"en-US" : "Getting the list of consoles..." ,
"en-US" : "Getting the list of consoles..." ,
"es-ES" : "Obteniendo la lista de consolas..." ,
"it-IT" : "Ottenere la lista delle consoles..." ,
"it-IT" : "Ottenere la lista delle consoles..." ,
"ja-JP" : "本体のリストを取得中..." ,
"ja-JP" : "本体のリストを取得中..." ,
"pl-PL" : "Pobieranie listy konsoli..." ,
"pl-PL" : "Pobieranie listy konsoli..." ,
@ -719,6 +732,7 @@ const Translations = {
"layout" : {
"layout" : {
"de-DE" : "Layout" ,
"de-DE" : "Layout" ,
"en-US" : "Layout" ,
"en-US" : "Layout" ,
"es-ES" : "Diseño" ,
"ja-JP" : "レイアウト" ,
"ja-JP" : "レイアウト" ,
"pl-PL" : "Układ" ,
"pl-PL" : "Układ" ,
"pt-BR" : "Layout" ,
"pt-BR" : "Layout" ,
@ -743,16 +757,20 @@ const Translations = {
"max-bitrate" : {
"max-bitrate" : {
"de-DE" : "Max. Bitrate" ,
"de-DE" : "Max. Bitrate" ,
"en-US" : "Max bitrate" ,
"en-US" : "Max bitrate" ,
"es-ES" : "Tasa de bits máxima" ,
"ja-JP" : "最大ビットレート" ,
"ja-JP" : "最大ビットレート" ,
"pl-PL" : "Maksymalny bitrate" ,
"pl-PL" : "Maksymalny bitrate" ,
"pt-BR" : "Taxa máxima dos bits" ,
"tr-TR" : "Maksimum bithı zı " ,
"tr-TR" : "Maksimum bithı zı " ,
"vi-VN" : "Bitrate tối đa" ,
"vi-VN" : "Bitrate tối đa" ,
} ,
} ,
"may-not-work-properly" : {
"may-not-work-properly" : {
"de-DE" : "Funktioniert evtl. nicht fehlerfrei!" ,
"de-DE" : "Funktioniert evtl. nicht fehlerfrei!" ,
"en-US" : "May not work properly!" ,
"en-US" : "May not work properly!" ,
"es-ES" : "¡Puede que no funcione correctamente!" ,
"ja-JP" : "正常に動作しない場合があります!" ,
"ja-JP" : "正常に動作しない場合があります!" ,
"pl-PL" : "Może nie działać poprawnie!" ,
"pl-PL" : "Może nie działać poprawnie!" ,
"pt-BR" : "Pode não funcionar corretamente!" ,
"tr-TR" : "Düzgün çalı şmayabilir!" ,
"tr-TR" : "Düzgün çalı şmayabilir!" ,
"vi-VN" : "Có thể không hoạt động!" ,
"vi-VN" : "Có thể không hoạt động!" ,
} ,
} ,
@ -789,6 +807,7 @@ const Translations = {
"microphone" : {
"microphone" : {
"de-DE" : "Mikrofon" ,
"de-DE" : "Mikrofon" ,
"en-US" : "Microphone" ,
"en-US" : "Microphone" ,
"es-ES" : "Micrófono" ,
"it-IT" : "Microfono" ,
"it-IT" : "Microfono" ,
"ja-JP" : "マイク" ,
"ja-JP" : "マイク" ,
"pl-PL" : "Mikrofon" ,
"pl-PL" : "Mikrofon" ,
@ -800,14 +819,17 @@ const Translations = {
"mouse-and-keyboard" : {
"mouse-and-keyboard" : {
"de-DE" : "Maus & Tastatur" ,
"de-DE" : "Maus & Tastatur" ,
"en-US" : "Mouse & Keyboard" ,
"en-US" : "Mouse & Keyboard" ,
"es-ES" : "Ratón y teclado" ,
"ja-JP" : "マウス&キーボード" ,
"ja-JP" : "マウス&キーボード" ,
"pl-PL" : "Mysz i klawiatura" ,
"pl-PL" : "Mysz i klawiatura" ,
"pt-BR" : "Mouse e Teclado" ,
"tr-TR" : "Klavye ve Fare" ,
"tr-TR" : "Klavye ve Fare" ,
"vi-VN" : "Chuột và Bàn phím" ,
"vi-VN" : "Chuột và Bàn phím" ,
} ,
} ,
"muted" : {
"muted" : {
"de-DE" : "Stumm" ,
"de-DE" : "Stumm" ,
"en-US" : "Muted" ,
"en-US" : "Muted" ,
"es-ES" : "Silenciado" ,
"it-IT" : "Microfono disattivato" ,
"it-IT" : "Microfono disattivato" ,
"ja-JP" : "ミュート" ,
"ja-JP" : "ミュート" ,
"pl-PL" : "Wyciszony" ,
"pl-PL" : "Wyciszony" ,
@ -819,6 +841,7 @@ const Translations = {
"no-consoles-found" : {
"no-consoles-found" : {
"de-DE" : "Keine Konsolen gefunden" ,
"de-DE" : "Keine Konsolen gefunden" ,
"en-US" : "No consoles found" ,
"en-US" : "No consoles found" ,
"es-ES" : "No se encontraron consolas" ,
"it-IT" : "Nessuna console trovata" ,
"it-IT" : "Nessuna console trovata" ,
"ja-JP" : "本体が見つかりません" ,
"ja-JP" : "本体が見つかりません" ,
"pl-PL" : "Nie znaleziono konsoli" ,
"pl-PL" : "Nie znaleziono konsoli" ,
@ -860,6 +883,7 @@ const Translations = {
"on" : {
"on" : {
"de-DE" : "An" ,
"de-DE" : "An" ,
"en-US" : "On" ,
"en-US" : "On" ,
"es-ES" : "Activado" ,
"it-IT" : "Attivo" ,
"it-IT" : "Attivo" ,
"ja-JP" : "オン" ,
"ja-JP" : "オン" ,
"pl-PL" : "Włącz" ,
"pl-PL" : "Włącz" ,
@ -871,8 +895,10 @@ const Translations = {
"only-supports-some-games" : {
"only-supports-some-games" : {
"de-DE" : "Unterstützt nur einige Spiele" ,
"de-DE" : "Unterstützt nur einige Spiele" ,
"en-US" : "Only supports some games" ,
"en-US" : "Only supports some games" ,
"es-ES" : "Sólo soporta algunos juegos" ,
"ja-JP" : "一部のゲームのみサポート" ,
"ja-JP" : "一部のゲームのみサポート" ,
"pl-PL" : "Wspiera tylko niektóre gry" ,
"pl-PL" : "Wspiera tylko niektóre gry" ,
"pt-BR" : "Suporta apenas alguns jogos" ,
"tr-TR" : "Yalnı zca belli oyunlar destekleniyor" ,
"tr-TR" : "Yalnı zca belli oyunlar destekleniyor" ,
"vi-VN" : "Chỉ hỗ trợ một vài game" ,
"vi-VN" : "Chỉ hỗ trợ một vài game" ,
} ,
} ,
@ -924,6 +950,7 @@ const Translations = {
"powered-off" : {
"powered-off" : {
"de-DE" : "Ausgeschaltet" ,
"de-DE" : "Ausgeschaltet" ,
"en-US" : "Powered off" ,
"en-US" : "Powered off" ,
"es-ES" : "Desactivado" ,
"it-IT" : "Spento" ,
"it-IT" : "Spento" ,
"ja-JP" : "本体オフ" ,
"ja-JP" : "本体オフ" ,
"pl-PL" : "Zasilanie wyłączone" ,
"pl-PL" : "Zasilanie wyłączone" ,
@ -935,6 +962,7 @@ const Translations = {
"powered-on" : {
"powered-on" : {
"de-DE" : "Eingeschaltet" ,
"de-DE" : "Eingeschaltet" ,
"en-US" : "Powered on" ,
"en-US" : "Powered on" ,
"es-ES" : "Activado" ,
"it-IT" : "Acceso" ,
"it-IT" : "Acceso" ,
"ja-JP" : "本体オン" ,
"ja-JP" : "本体オン" ,
"pl-PL" : "Zasilanie włączone" ,
"pl-PL" : "Zasilanie włączone" ,
@ -1021,6 +1049,7 @@ const Translations = {
"remote-play" : {
"remote-play" : {
"de-DE" : "Remote Play" ,
"de-DE" : "Remote Play" ,
"en-US" : "Remote Play" ,
"en-US" : "Remote Play" ,
"es-ES" : "Reproducción remota" ,
"it-IT" : "Riproduzione Remota" ,
"it-IT" : "Riproduzione Remota" ,
"ja-JP" : "リモートプレイ" ,
"ja-JP" : "リモートプレイ" ,
"pl-PL" : "Gra zdalna" ,
"pl-PL" : "Gra zdalna" ,
@ -1257,8 +1286,10 @@ const Translations = {
"slow" : {
"slow" : {
"de-DE" : "Langsam" ,
"de-DE" : "Langsam" ,
"en-US" : "Slow" ,
"en-US" : "Slow" ,
"es-ES" : "Lento" ,
"ja-JP" : "低速" ,
"ja-JP" : "低速" ,
"pl-PL" : "Wolno" ,
"pl-PL" : "Wolno" ,
"pt-BR" : "Lento" ,
"tr-TR" : "Yavaş" ,
"tr-TR" : "Yavaş" ,
"vi-VN" : "Chậm" ,
"vi-VN" : "Chậm" ,
} ,
} ,
@ -1280,6 +1311,7 @@ const Translations = {
"smart-tv" : {
"smart-tv" : {
"de-DE" : "Smart TV" ,
"de-DE" : "Smart TV" ,
"en-US" : "Smart TV" ,
"en-US" : "Smart TV" ,
"es-ES" : "Smart TV" ,
"ja-JP" : "スマートTV" ,
"ja-JP" : "スマートTV" ,
"pl-PL" : "Smart TV" ,
"pl-PL" : "Smart TV" ,
"pt-BR" : "Smart TV" ,
"pt-BR" : "Smart TV" ,
@ -1289,6 +1321,7 @@ const Translations = {
"sound" : {
"sound" : {
"de-DE" : "Ton" ,
"de-DE" : "Ton" ,
"en-US" : "Sound" ,
"en-US" : "Sound" ,
"es-ES" : "Sonido" ,
"it-IT" : "Suoni" ,
"it-IT" : "Suoni" ,
"ja-JP" : "サウンド" ,
"ja-JP" : "サウンド" ,
"pl-PL" : "Dźwięk" ,
"pl-PL" : "Dźwięk" ,
@ -1300,6 +1333,7 @@ const Translations = {
"standby" : {
"standby" : {
"de-DE" : "Standby" ,
"de-DE" : "Standby" ,
"en-US" : "Standby" ,
"en-US" : "Standby" ,
"es-ES" : "Modo de espera" ,
"it-IT" : "Sospendi" ,
"it-IT" : "Sospendi" ,
"ja-JP" : "スタンバイ" ,
"ja-JP" : "スタンバイ" ,
"pl-PL" : "Stan czuwania" ,
"pl-PL" : "Stan czuwania" ,
@ -1671,6 +1705,7 @@ const Translations = {
"unknown" : {
"unknown" : {
"de-DE" : "Unbekannt" ,
"de-DE" : "Unbekannt" ,
"en-US" : "Unknown" ,
"en-US" : "Unknown" ,
"es-ES" : "Desconocido" ,
"it-IT" : "Sconosciuto" ,
"it-IT" : "Sconosciuto" ,
"ja-JP" : "不明" ,
"ja-JP" : "不明" ,
"pl-PL" : "Nieznane" ,
"pl-PL" : "Nieznane" ,
@ -1682,14 +1717,17 @@ const Translations = {
"unlimited" : {
"unlimited" : {
"de-DE" : "Unbegrenzt" ,
"de-DE" : "Unbegrenzt" ,
"en-US" : "Unlimited" ,
"en-US" : "Unlimited" ,
"es-ES" : "Ilimitado" ,
"ja-JP" : "無制限" ,
"ja-JP" : "無制限" ,
"pl-PL" : "Bez ograniczeń" ,
"pl-PL" : "Bez ograniczeń" ,
"pt-BR" : "Ilimitado" ,
"tr-TR" : "Limitsiz" ,
"tr-TR" : "Limitsiz" ,
"vi-VN" : "Không giới hạn" ,
"vi-VN" : "Không giới hạn" ,
} ,
} ,
"unmuted" : {
"unmuted" : {
"de-DE" : "Ton an" ,
"de-DE" : "Ton an" ,
"en-US" : "Unmuted" ,
"en-US" : "Unmuted" ,
"es-ES" : "Activar sonido" ,
"it-IT" : "Microfono attivato" ,
"it-IT" : "Microfono attivato" ,
"ja-JP" : "ミュート解除" ,
"ja-JP" : "ミュート解除" ,
"pl-PL" : "Wyciszenie wyłączone" ,
"pl-PL" : "Wyciszenie wyłączone" ,
@ -1701,8 +1739,10 @@ const Translations = {
"use-mouse-absolute-position" : {
"use-mouse-absolute-position" : {
"de-DE" : "Absolute Position der Maus verwenden" ,
"de-DE" : "Absolute Position der Maus verwenden" ,
"en-US" : "Use mouse's absolute position" ,
"en-US" : "Use mouse's absolute position" ,
"es-ES" : "Usar la posición absoluta del ratón" ,
"ja-JP" : "マウスの絶対座標を使用" ,
"ja-JP" : "マウスの絶対座標を使用" ,
"pl-PL" : "Użyj pozycji bezwzględnej myszy" ,
"pl-PL" : "Użyj pozycji bezwzględnej myszy" ,
"pt-BR" : "Usar posição absoluta do mouse" ,
"tr-TR" : "Farenin mutlak pozisyonunu baz al" ,
"tr-TR" : "Farenin mutlak pozisyonunu baz al" ,
"vi-VN" : "Sử dụng vị trí tuyệt đối của chuột" ,
"vi-VN" : "Sử dụng vị trí tuyệt đối của chuột" ,
} ,
} ,
@ -2079,13 +2119,12 @@ class RemotePlay {
$connectButton = CE ( 'button' , { 'class' : 'bx-primary-button bx-no-margin' } , _ _ ( 'console-connect' ) ) ,
$connectButton = CE ( 'button' , { 'class' : 'bx-primary-button bx-no-margin' } , _ _ ( 'console-connect' ) ) ,
) ;
) ;
REMOTE _PLAY _CONFIG = {
serverId : con . serverId ,
} ;
$connectButton . addEventListener ( 'click' , e => {
$connectButton . addEventListener ( 'click' , e => {
const url = window . location . href . substring ( 0 , 31 ) + '/launch/starfield/9NCJSXWZTP88#remote-play' ;
REMOTE _PLAY _CONFIG = {
// const url = '/play';
serverId : con . serverId ,
} ;
const url = window . location . href . substring ( 0 , 31 ) + '/launch/fortnite/BT5P2X999VH2#remote-play' ;
const $pageContent = document . getElementById ( 'PageContent' ) ;
const $pageContent = document . getElementById ( 'PageContent' ) ;
const $anchor = CE ( 'a' , { href : url , class : 'bx-hidden' , style : 'position:absolute;top:-9990px;left:-9999px' } , '' ) ;
const $anchor = CE ( 'a' , { href : url , class : 'bx-hidden' , style : 'position:absolute;top:-9990px;left:-9999px' } , '' ) ;
@ -5374,9 +5413,6 @@ function interceptHttpRequests() {
try {
try {
const clone = request . clone ( ) ;
const clone = request . clone ( ) ;
const resp = ( await ( await orgFetch ( ... arg ) ) . json ( ) ) ;
RemotePlay . XCLOUD _TOKEN = resp . gsToken ;
const obj = await clone . json ( ) ;
const obj = await clone . json ( ) ;
obj . offeringId = 'xhome' ;
obj . offeringId = 'xhome' ;
@ -5457,6 +5493,9 @@ function interceptHttpRequests() {
return promise . then ( response => {
return promise . then ( response => {
return response . clone ( ) . json ( ) . then ( obj => {
return response . clone ( ) . json ( ) . then ( obj => {
// Store xCloud token
RemotePlay . XCLOUD _TOKEN = obj . gsToken ;
// Get server list
// Get server list
if ( ! Object . keys ( SERVER _REGIONS ) . length ) {
if ( ! Object . keys ( SERVER _REGIONS ) . length ) {
for ( let region of obj . offeringSettings . regions ) {
for ( let region of obj . offeringSettings . regions ) {